lambda_router_macros/
lib.rs

1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{parse_macro_input, ItemFn};
4
5mod app_macro;
6mod router_macro;
7
8/// wraps your function in a new one that handles http requests and returns responses
9///
10/// # Syntax
11///
12/// the first thing to do is specify the method in all caps without quotes
13/// #[router(GET)]
14///
15/// from there specify the path to the resource you want to bind to that is quoted & starts with a leading slash
16/// #[router(GET "/my_route")]
17///
18///
19/// # Examples
20///
21/// ```
22/// #[router(GET "/my_route")]
23/// pub async fn my_route(input: ()) -> Result<(), ()> {
24///     todo!();
25///     Ok(())
26/// }
27/// ```
28#[proc_macro_attribute]
29pub fn router(args: TokenStream, input: TokenStream) -> TokenStream {
30    let arguments = parse_macro_input!(args as router_macro::arguments::Arguments);
31    let item_fn = parse_macro_input!(input as ItemFn);
32
33    let ast = router_macro::ast::Ast { item_fn, arguments };
34
35    quote! {
36        #ast
37    }
38    .into()
39}
40
41/// provides the entry point for lambdas to handle routing
42///
43/// # Syntax
44/// app! { #EVENT,  ...#HANDLERS,  #\[default\] 404_HANDLER, ...#HANDLERS  }
45///
46/// you are not required to put #\[not_found\] for the 404 handler at the bottom but it is recommended
47///
48/// # Examples
49///
50/// ```
51/// app! {
52///     event,
53///     my_route,
54///     #[not_found]
55///     not_found,
56/// }
57/// ```
58#[proc_macro]
59pub fn app(input: TokenStream) -> TokenStream {
60    let lambda_app = parse_macro_input!(input as app_macro::lambda_app::LambdaApp);
61
62    quote! {
63        #lambda_app
64    }
65    .into()
66}