3个版本

0.1.2 2021年7月24日
0.1.1 2021年7月18日
0.1.0 2021年7月18日

#786 in 过程宏

30 每月下载量
用于 3 个crate(直接使用2个)

MIT 许可证

45KB
972

mattro-rs

mattro 是一个用于Rust的 proc_macro 属性解析器。

使用方法

将此添加到你的Cargo.toml中

[dependencies]
mattro = "0.1.1"

你可以使用

  • Attribute 通过 MacroAttribute::new(attribute)
  • AttributeArgs 通过 MacroAttribute::from_attribute_args(path, args, style)

示例

解析 AttributeArgs

main.rs

#[my_attribute(text="some text", number=120, array=1,2,3)]
fn main() {}

lib.rs

use mattro::MacroAttribute;
use proc_macro::TokenStream;

#[proc_macro_attribute]
pub fn my_attribute(attribute: TokenStream, item: TokenStream) -> TokenStream {
    let tokens = attribute.clone();
    let attribute_args: syn::AttributeArgs = syn::parse_macro_input!(tokens);

    // Creates a `MacroAttribute` from `AttributeArgs`.
    let attr = MacroAttribute::from_attribute_args(
        // Path of the attribute
        "my_attribute",

        // The `AttributeArgs`
        attribute_args,

        // The attribute style `inner` or `outer`
        syn::AttrStyle::Outer
    );

    // Prints all the `MetaItem`s
    for meta_item in &attr {
        println!("{:#?}", meta_item);
    }

    // Returns the decorated item
    item
}

这将输出

NameValue(
    NameValue {
        name: "text",
        value: Literal(
            Str(
                LitStr {
                    token: "some text",
                },
            ),
        ),
    },
)
NameValue(
    NameValue {
        name: "number",
        value: Literal(
            Int(
                LitInt {
                    token: 120,
                },
            ),
        ),
    },
)
NameValue(
    NameValue {
        name: "array",
        value: Array(
            [
                Int(
                    LitInt {
                        token: 1,
                    },
                ),
                Int(
                    LitInt {
                        token: 2,
                    },
                ),
                Int(
                    LitInt {
                        token: 3,
                    },
                ),
            ],
        ),
    },
)

你可以将属性转换为 键值对

// Converts the attribute into a `name-value` attribute
let name_values_attributes = attr.into_name_values().unwrap();

// Iterate over the `name-value` pairs
for (name, value) in &name_values_attributes {
    println!("{:7} => {}", name, value);
}

这将输出

text    => "some text"
number  => 120
array   => [1, 2, 3]

依赖项

~1.5MB
~37K SLoC