lambda_router_macros/app_macro/
lambda_app.rs1use 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}