@@ -136,7 +136,7 @@ fn parse_string(int: syn::Lit, span: Span, field: &str) -> Result<String, syn::E
136
136
137
137
fn parse_knobs (
138
138
input : syn:: ItemFn ,
139
- args : syn:: AttributeArgs ,
139
+ args : Vec < syn:: Meta > ,
140
140
is_test : bool ,
141
141
rt_multi_thread : bool ,
142
142
) -> Result < TokenStream , syn:: Error > {
@@ -156,18 +156,32 @@ fn parse_knobs(
156
156
157
157
for arg in args {
158
158
match arg {
159
- syn:: NestedMeta :: Meta ( syn :: Meta :: NameValue ( namevalue) ) => {
159
+ syn:: Meta :: NameValue ( namevalue) => {
160
160
let ident = namevalue. path . get_ident ( ) ;
161
161
if ident. is_none ( ) {
162
162
let msg = "Must have specified ident" ;
163
163
return Err ( syn:: Error :: new_spanned ( namevalue, msg) ) ;
164
164
}
165
165
match ident. unwrap ( ) . to_string ( ) . to_lowercase ( ) . as_str ( ) {
166
166
"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
+ }
168
175
}
169
176
"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
+ }
171
185
}
172
186
"core_threads" => {
173
187
let msg = "Attribute `core_threads` is renamed to `worker_threads`" ;
@@ -179,7 +193,7 @@ fn parse_knobs(
179
193
}
180
194
}
181
195
}
182
- syn:: NestedMeta :: Meta ( syn :: Meta :: Path ( path) ) => {
196
+ syn:: Meta :: Path ( path) => {
183
197
let ident = path. get_ident ( ) ;
184
198
if ident. is_none ( ) {
185
199
let msg = "Must have specified ident" ;
@@ -279,7 +293,8 @@ fn parse_knobs(
279
293
#[ cfg( not( test) ) ] // Work around for rust-lang/rust#62127
280
294
pub ( crate ) fn main ( args : TokenStream , item : TokenStream , rt_multi_thread : bool ) -> TokenStream {
281
295
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 ( ) ;
283
298
284
299
if input. sig . ident == "main" && !input. sig . inputs . is_empty ( ) {
285
300
let msg = "the main function cannot accept arguments" ;
0 commit comments