15
15
16
16
use proc_macro:: TokenStream ;
17
17
use quote:: quote;
18
+ use syn:: parse:: Parser as _;
19
+
20
+ type AttributeArgs = syn:: punctuated:: Punctuated < syn:: Meta , syn:: Token ![ , ] > ;
18
21
19
22
/// Marks async entry-point function to be executed by Actix system.
20
23
///
@@ -25,17 +28,21 @@ use quote::quote;
25
28
/// println!("Hello world");
26
29
/// }
27
30
/// ```
28
- #[ allow( clippy:: needless_doctest_main) ]
31
+ // #[allow(clippy::needless_doctest_main)]
32
+ // #[cfg(not(test))] // Work around for rust-lang/rust#62127
29
33
#[ proc_macro_attribute]
30
- #[ cfg( not( test) ) ] // Work around for rust-lang/rust#62127
31
34
pub fn main ( args : TokenStream , item : TokenStream ) -> TokenStream {
32
35
let mut input = match syn:: parse :: < syn:: ItemFn > ( item. clone ( ) ) {
33
36
Ok ( input) => input,
34
37
// on parse err, make IDEs happy; see fn docs
35
38
Err ( err) => return input_and_compile_error ( item, err) ,
36
39
} ;
37
40
38
- let args = syn:: parse_macro_input!( args as syn:: AttributeArgs ) ;
41
+ let parser = AttributeArgs :: parse_terminated;
42
+ let args = match parser. parse ( args. clone ( ) ) {
43
+ Ok ( args) => args,
44
+ Err ( err) => return input_and_compile_error ( args, err) ,
45
+ } ;
39
46
40
47
let attrs = & input. attrs ;
41
48
let vis = & input. vis ;
@@ -55,11 +62,15 @@ pub fn main(args: TokenStream, item: TokenStream) -> TokenStream {
55
62
56
63
for arg in & args {
57
64
match arg {
58
- syn:: NestedMeta :: Meta ( syn:: Meta :: NameValue ( syn:: MetaNameValue {
59
- lit : syn:: Lit :: Str ( lit) ,
65
+ syn:: Meta :: NameValue ( syn:: MetaNameValue {
60
66
path,
67
+ value :
68
+ syn:: Expr :: Lit ( syn:: ExprLit {
69
+ lit : syn:: Lit :: Str ( lit) ,
70
+ ..
71
+ } ) ,
61
72
..
62
- } ) ) => match path
73
+ } ) => match path
63
74
. get_ident ( )
64
75
. map ( |i| i. to_string ( ) . to_lowercase ( ) )
65
76
. as_deref ( )
@@ -78,6 +89,7 @@ pub fn main(args: TokenStream, item: TokenStream) -> TokenStream {
78
89
. into ( ) ;
79
90
}
80
91
} ,
92
+
81
93
_ => {
82
94
return syn:: Error :: new_spanned ( arg, "Unknown attribute specified" )
83
95
. to_compile_error ( )
@@ -114,7 +126,11 @@ pub fn test(args: TokenStream, item: TokenStream) -> TokenStream {
114
126
Err ( err) => return input_and_compile_error ( item, err) ,
115
127
} ;
116
128
117
- let args = syn:: parse_macro_input!( args as syn:: AttributeArgs ) ;
129
+ let parser = AttributeArgs :: parse_terminated;
130
+ let args = match parser. parse ( args. clone ( ) ) {
131
+ Ok ( args) => args,
132
+ Err ( err) => return input_and_compile_error ( args, err) ,
133
+ } ;
118
134
119
135
let attrs = & input. attrs ;
120
136
let vis = & input. vis ;
@@ -123,7 +139,7 @@ pub fn test(args: TokenStream, item: TokenStream) -> TokenStream {
123
139
let mut has_test_attr = false ;
124
140
125
141
for attr in attrs {
126
- if attr. path . is_ident ( "test" ) {
142
+ if attr. path ( ) . is_ident ( "test" ) {
127
143
has_test_attr = true ;
128
144
}
129
145
}
@@ -149,11 +165,15 @@ pub fn test(args: TokenStream, item: TokenStream) -> TokenStream {
149
165
150
166
for arg in & args {
151
167
match arg {
152
- syn:: NestedMeta :: Meta ( syn:: Meta :: NameValue ( syn:: MetaNameValue {
153
- lit : syn:: Lit :: Str ( lit) ,
168
+ syn:: Meta :: NameValue ( syn:: MetaNameValue {
154
169
path,
170
+ value :
171
+ syn:: Expr :: Lit ( syn:: ExprLit {
172
+ lit : syn:: Lit :: Str ( lit) ,
173
+ ..
174
+ } ) ,
155
175
..
156
- } ) ) => match path
176
+ } ) => match path
157
177
. get_ident ( )
158
178
. map ( |i| i. to_string ( ) . to_lowercase ( ) )
159
179
. as_deref ( )
0 commit comments