@@ -27,8 +27,10 @@ use quote::quote;
27
27
#[ allow( clippy:: needless_doctest_main) ]
28
28
#[ proc_macro_attribute]
29
29
#[ cfg( not( test) ) ] // Work around for rust-lang/rust#62127
30
- pub fn main ( _ : TokenStream , item : TokenStream ) -> TokenStream {
30
+ pub fn main ( args : TokenStream , item : TokenStream ) -> TokenStream {
31
31
let mut input = syn:: parse_macro_input!( item as syn:: ItemFn ) ;
32
+ let args = syn:: parse_macro_input!( args as syn:: AttributeArgs ) ;
33
+
32
34
let attrs = & input. attrs ;
33
35
let vis = & input. vis ;
34
36
let sig = & mut input. sig ;
@@ -43,13 +45,47 @@ pub fn main(_: TokenStream, item: TokenStream) -> TokenStream {
43
45
. into ( ) ;
44
46
}
45
47
48
+ let mut system = syn:: parse_str :: < syn:: Path > ( "::actix_rt::System" ) . unwrap ( ) ;
49
+
50
+ for arg in & args {
51
+ match arg {
52
+ syn:: NestedMeta :: Meta ( syn:: Meta :: NameValue ( syn:: MetaNameValue {
53
+ lit : syn:: Lit :: Str ( lit) ,
54
+ path,
55
+ ..
56
+ } ) ) => match path
57
+ . get_ident ( )
58
+ . map ( |i| i. to_string ( ) . to_lowercase ( ) )
59
+ . as_deref ( )
60
+ {
61
+ Some ( "system" ) => match lit. parse ( ) {
62
+ Ok ( path) => system = path,
63
+ Err ( _) => {
64
+ return syn:: Error :: new_spanned ( lit, "Expected path" )
65
+ . to_compile_error ( )
66
+ . into ( ) ;
67
+ }
68
+ } ,
69
+ _ => {
70
+ return syn:: Error :: new_spanned ( arg, "Unknown attribute specified" )
71
+ . to_compile_error ( )
72
+ . into ( ) ;
73
+ }
74
+ } ,
75
+ _ => {
76
+ return syn:: Error :: new_spanned ( arg, "Unknown attribute specified" )
77
+ . to_compile_error ( )
78
+ . into ( ) ;
79
+ }
80
+ }
81
+ }
82
+
46
83
sig. asyncness = None ;
47
84
48
85
( quote ! {
49
86
#( #attrs) *
50
87
#vis #sig {
51
- actix_rt:: System :: new( )
52
- . block_on( async move { #body } )
88
+ <#system>:: new( ) . block_on( async move { #body } )
53
89
}
54
90
} )
55
91
. into ( )
0 commit comments