我正在编写一个属性宏并尝试解析那里传递的参数。
喜欢:#[macro(Arg1, Arg2)]
问题是我找不到正确的结构来解析它。我尝试将其解析为Meta
andMetaList
但它们似乎都不起作用。
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);
}
Run Code Online (Sandbox Code Playgroud)
当我解析它时,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!()`
Run Code Online (Sandbox Code Playgroud)