@@ -2,12 +2,20 @@ extern crate proc_macro;
2
2
3
3
use proc_macro:: TokenStream ;
4
4
use quote:: quote_spanned;
5
- use syn:: { spanned:: Spanned , FnArg , ItemFn } ;
5
+ use syn:: { spanned:: Spanned , AttributeArgs , FnArg , ItemFn , Meta , NestedMeta } ;
6
+
7
+ /// Return true if attribute macro args declares http flavor in the form `#[lambda(http)]`
8
+ fn is_http ( args : & AttributeArgs ) -> bool {
9
+ args. iter ( ) . any ( |arg| match arg {
10
+ NestedMeta :: Meta ( Meta :: Path ( path) ) => path. is_ident ( "http" ) ,
11
+ _ => false ,
12
+ } )
13
+ }
6
14
7
15
#[ proc_macro_attribute]
8
- pub fn lambda ( _attr : TokenStream , item : TokenStream ) -> TokenStream {
16
+ pub fn lambda ( attr : TokenStream , item : TokenStream ) -> TokenStream {
9
17
let input = syn:: parse_macro_input!( item as ItemFn ) ;
10
-
18
+ let args = syn :: parse_macro_input! ( attr as AttributeArgs ) ;
11
19
let ret = & input. sig . output ;
12
20
let name = & input. sig . ident ;
13
21
let body = & input. block ;
@@ -17,7 +25,7 @@ pub fn lambda(_attr: TokenStream, item: TokenStream) -> TokenStream {
17
25
18
26
if name != "main" {
19
27
let tokens = quote_spanned ! { name. span( ) =>
20
- compile_error!( "only the main function can be tagged with #[lambda::main ]" ) ;
28
+ compile_error!( "only the main function can be tagged with #[lambda]" ) ;
21
29
} ;
22
30
return TokenStream :: from ( tokens) ;
23
31
}
@@ -43,16 +51,32 @@ pub fn lambda(_attr: TokenStream, item: TokenStream) -> TokenStream {
43
51
let arg_name = & event. pat ;
44
52
let arg_type = & event. ty ;
45
53
46
- quote_spanned ! { input. span( ) =>
47
- use lambda:: LambdaCtx ;
54
+ if is_http ( & args) {
55
+ quote_spanned ! { input. span( ) =>
56
+ use lambda_http:: lambda:: LambdaCtx ;
57
+
58
+ #( #attrs) *
59
+ #asyncness fn main( ) {
60
+ async fn actual( #arg_name: #arg_type) #ret {
61
+ #body
62
+ }
63
+ let f = lambda_http:: handler( actual) ;
64
+ lambda_http:: lambda:: run( f) . await . unwrap( ) ;
65
+ }
66
+ }
67
+ } else {
68
+ quote_spanned ! { input. span( ) =>
69
+
70
+ use lambda:: LambdaCtx ;
48
71
49
- #( #attrs) *
50
- #asyncness fn main( ) {
51
- async fn actual( #arg_name: #arg_type) #ret {
52
- #body
72
+ #( #attrs) *
73
+ #asyncness fn main( ) {
74
+ async fn actual( #arg_name: #arg_type) #ret {
75
+ #body
76
+ }
77
+ let f = lambda:: handler_fn( actual) ;
78
+ lambda:: run( f) . await . unwrap( ) ;
53
79
}
54
- let f = lambda:: handler_fn( actual) ;
55
- lambda:: run( f) . await . unwrap( ) ;
56
80
}
57
81
}
58
82
}
0 commit comments