lambda-router-macros 0.1.2

Macros for use within lambda-router crate
Documentation
use quote::{quote, ToTokens, TokenStreamExt};
use syn::{
    parse::{Parse, ParseStream},
    Expr, Ident, Result, Token,
};

use super::handler::HandlerSet;

pub struct LambdaApp {
    event: Ident,
    handlers: Vec<Expr>,
    default_handler: Expr,
}

impl Parse for LambdaApp {
    fn parse(input: ParseStream) -> Result<Self> {
        let event: Ident = input.parse()?;
        let _: Token!(,) = input.parse()?;

        let mut handler_set = HandlerSet::new();
        while !input.is_empty() {
            let handler = input.parse()?;
            handler_set.push(handler);
        }

        let default_handler = handler_set.default_handler(input.span())?;
        let handlers = handler_set.into_expr();

        Ok(Self {
            event,
            handlers,
            default_handler,
        })
    }
}

impl ToTokens for LambdaApp {
    fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
        let event = &self.event;
        let handlers = &self.handlers;
        let default_handler = &self.default_handler;

        let output = quote! {
            #( if let Some(r) = #handlers(& #event).await? {
                return Ok(r);
            })*
            #default_handler (#event) .await
        };

        tokens.append_all(output);
    }
}