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个)
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