在 Rust 中解析属性宏参数
Parsing Attribute Macro Arguments in Rust
我正在编写属性宏并尝试解析传递到那里的参数。
喜欢:#[macro(Arg1, Arg2)]
问题是我找不到正确的结构来解析它。我尝试将其解析为 Meta 和 MetaList,但其中 none 似乎有效。
pub fn some_macro(args: TokenStream, item: TokenStream) -> TokenStream {
let args_parsed = parse_macro_input!(args as MetaList);
////////
let args_parsed = parse_macro_input!(args as Meta);
}
当我将它解析为 MetaList 时,我得到:意外的输入结束,预期的括号错误。
如有任何帮助,我们将不胜感激。
我假设您使用 syn
箱子。
Proc 宏没有将它们的参数作为元数据获取,但是在剥离 #[name(...)]
之后。也就是说,args
将包含 Arg1, Arg2
而不是 #[macro(Arg1, Arg2)]
,这是 Meta
(和 MetaList
)所期望的。
你要的是Punctuated
:
// Note that I put `syn::Path` but you can put whatever you want to parse between the commas.
// For example `syn::NestedMeta` if you want the full attribute syntax.
let args_parsed = syn::punctuated::Punctuated::<syn::Path, syn::Token![,]>::parse_terminated
.parse(args)
.unwrap(); // Better to turn it into a `compile_error!()`
我正在编写属性宏并尝试解析传递到那里的参数。
喜欢:#[macro(Arg1, Arg2)]
问题是我找不到正确的结构来解析它。我尝试将其解析为 Meta 和 MetaList,但其中 none 似乎有效。
pub fn some_macro(args: TokenStream, item: TokenStream) -> TokenStream {
let args_parsed = parse_macro_input!(args as MetaList);
////////
let args_parsed = parse_macro_input!(args as Meta);
}
当我将它解析为 MetaList 时,我得到:意外的输入结束,预期的括号错误。
如有任何帮助,我们将不胜感激。
我假设您使用 syn
箱子。
Proc 宏没有将它们的参数作为元数据获取,但是在剥离 #[name(...)]
之后。也就是说,args
将包含 Arg1, Arg2
而不是 #[macro(Arg1, Arg2)]
,这是 Meta
(和 MetaList
)所期望的。
你要的是Punctuated
:
// Note that I put `syn::Path` but you can put whatever you want to parse between the commas.
// For example `syn::NestedMeta` if you want the full attribute syntax.
let args_parsed = syn::punctuated::Punctuated::<syn::Path, syn::Token![,]>::parse_terminated
.parse(args)
.unwrap(); // Better to turn it into a `compile_error!()`