lambda_router_macros/app_macro/
lambda_app.rs

1use quote::{quote, ToTokens, TokenStreamExt};
2use syn::{
3    parse::{Parse, ParseStream},
4    Expr, Ident, Result, Token,
5};
6
7use super::handler::HandlerSet;
8
9pub struct LambdaApp {
10    event: Ident,
11    handlers: Vec<Expr>,
12    default_handler: Expr,
13}
14
15impl Parse for LambdaApp {
16    fn parse(input: ParseStream) -> Result<Self> {
17        let event: Ident = input.parse()?;
18        let _: Token!(,) = input.parse()?;
19
20        let mut handler_set = HandlerSet::new();
21        while !input.is_empty() {
22            let handler = input.parse()?;
23            handler_set.push(handler);
24        }
25
26        let default_handler = handler_set.default_handler(input.span())?;
27        let handlers = handler_set.into_expr();
28
29        Ok(Self {
30            event,
31            handlers,
32            default_handler,
33        })
34    }
35}
36
37impl ToTokens for LambdaApp {
38    fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
39        let event = &self.event;
40        let handlers = &self.handlers;
41        let default_handler = &self.default_handler;
42
43        let output = quote! {
44            #( if let Some(r) = #handlers(& #event).await? {
45                return Ok(r);
46            })*
47            #default_handler (#event) .await
48        };
49
50        tokens.append_all(output);
51    }
52}