@@ -136,7 +136,7 @@ fn parse_string(int: syn::Lit, span: Span, field: &str) -> Result<String, syn::E
136136
137137fn parse_knobs (
138138 input : syn:: ItemFn ,
139- args : syn:: AttributeArgs ,
139+ args : Vec < syn:: Meta > ,
140140 is_test : bool ,
141141 rt_multi_thread : bool ,
142142) -> Result < TokenStream , syn:: Error > {
@@ -156,18 +156,32 @@ fn parse_knobs(
156156
157157 for arg in args {
158158 match arg {
159- syn:: NestedMeta :: Meta ( syn :: Meta :: NameValue ( namevalue) ) => {
159+ syn:: Meta :: NameValue ( namevalue) => {
160160 let ident = namevalue. path . get_ident ( ) ;
161161 if ident. is_none ( ) {
162162 let msg = "Must have specified ident" ;
163163 return Err ( syn:: Error :: new_spanned ( namevalue, msg) ) ;
164164 }
165165 match ident. unwrap ( ) . to_string ( ) . to_lowercase ( ) . as_str ( ) {
166166 "worker_threads" => {
167- config. set_worker_threads ( namevalue. lit . clone ( ) , namevalue. span ( ) ) ?;
167+ if let syn:: Expr :: Lit ( expr_lit) = & namevalue. value {
168+ config. set_worker_threads ( expr_lit. lit . clone ( ) , namevalue. span ( ) ) ?;
169+ } else {
170+ return Err ( syn:: Error :: new_spanned (
171+ & namevalue. value ,
172+ "Expected a literal value" ,
173+ ) ) ;
174+ }
168175 }
169176 "flavor" => {
170- config. set_flavor ( namevalue. lit . clone ( ) , namevalue. span ( ) ) ?;
177+ if let syn:: Expr :: Lit ( expr_lit) = & namevalue. value {
178+ config. set_flavor ( expr_lit. lit . clone ( ) , namevalue. span ( ) ) ?;
179+ } else {
180+ return Err ( syn:: Error :: new_spanned (
181+ & namevalue. value ,
182+ "Expected a literal value" ,
183+ ) ) ;
184+ }
171185 }
172186 "core_threads" => {
173187 let msg = "Attribute `core_threads` is renamed to `worker_threads`" ;
@@ -179,7 +193,7 @@ fn parse_knobs(
179193 }
180194 }
181195 }
182- syn:: NestedMeta :: Meta ( syn :: Meta :: Path ( path) ) => {
196+ syn:: Meta :: Path ( path) => {
183197 let ident = path. get_ident ( ) ;
184198 if ident. is_none ( ) {
185199 let msg = "Must have specified ident" ;
@@ -279,7 +293,8 @@ fn parse_knobs(
279293#[ cfg( not( test) ) ] // Work around for rust-lang/rust#62127
280294pub ( crate ) fn main ( args : TokenStream , item : TokenStream , rt_multi_thread : bool ) -> TokenStream {
281295 let input = syn:: parse_macro_input!( item as syn:: ItemFn ) ;
282- let args = syn:: parse_macro_input!( args as syn:: AttributeArgs ) ;
296+ let args = syn:: parse_macro_input!( args with syn:: punctuated:: Punctuated :: <syn:: Meta , syn:: Token ![ , ] >:: parse_terminated) ;
297+ let args: Vec < syn:: Meta > = args. into_iter ( ) . collect ( ) ;
283298
284299 if input. sig . ident == "main" && !input. sig . inputs . is_empty ( ) {
285300 let msg = "the main function cannot accept arguments" ;
0 commit comments