#attributes #functional #macro #parse-attributes #nom

attr-parser-fn

以函数式方式解析属性进程宏

5个不稳定版本

新版本 0.3.4 2024年8月19日
0.2.2 2024年7月24日
0.2.1 2024年7月23日
0.2.0 2024年5月6日
0.1.0 2024年5月6日

#167 in 进程宏

Download history 217/week @ 2024-05-01 48/week @ 2024-05-08 2/week @ 2024-05-15 7/week @ 2024-05-22 1/week @ 2024-06-05 3/week @ 2024-06-12 66/week @ 2024-07-17 153/week @ 2024-07-24 42/week @ 2024-07-31 136/week @ 2024-08-14

每月下载量 397

MIT 许可证

25KB
698

derive-attr

以函数式方式解析属性进程宏。每个元组使用的长度最多为20。

示例

fn main() {
    let attr: Attribute = parse_quote! {
        #[my_attr(
            "hello",
            "world",
            122,
            conf1 = 114 + 514,
            key_value = SomeType<A, B>,
            path_only,
            nested(tea(green_tea)))
        ]
    };

    let parser = ParseArgs::new()
        .args::<(LitStr, LitStr)>()
        .opt_args::<(Lit, Lit)>()
        .rest_args::<Vec<Lit>>()
        .meta((
            ("path_only", path_only()),
            ("key_value", key_value::<Type>()),
            ("kv_optional", key_value::<Expr>()).optional(),
            conflicts((
                ("conf1", path_only()).value("conf1"),
                ("conf1", key_value::<Expr>()).value("conf1_expr"),
                ("conf2", key_value::<Expr>()).value("conf2"),
            )),
            (
                "nested",
                meta_list((
                    ("milk", path_only()),
                    (
                        "tea",
                        meta_list(conflicts((
                            ("red_tea", path_only()).value("red_tea"),
                            ("green_tea", path_only()).value("green_tea"),
                        ))),
                    ),
                )),
            ),
        ));

    let ParseArgs {
        args: (_, _),              // ("hello", "world")
        opt_args: (Some(_), None), // (Some(112), None)
        rest_args: _,              // []
        meta:
            (
                true,
                _, // SomeType<A, B>
                None,
                "conf1_expr",
                (false, "green_tea"),
            ),
    } = parser.parse_attrs(&attr).unwrap()
    else {
        unreachable!()
    };
}

依赖关系

~265–710KB
~17K SLoC