lambda_router_macros/app_macro/
handler.rs

1use proc_macro2::Span;
2use syn::{
3    parse::{Parse, ParseStream},
4    Attribute, Error, Expr, Result, Token,
5};
6
7pub struct HandlerSet {
8    set: Vec<Handler>,
9}
10
11impl HandlerSet {
12    pub fn new() -> Self {
13        HandlerSet { set: Vec::new() }
14    }
15
16    pub fn push(&mut self, handler: Handler) {
17        self.set.push(handler);
18    }
19
20    pub fn default_handler(&mut self, span: Span) -> Result<Expr> {
21        let pos = self.set.iter().position(|el| el.default).ok_or(Error::new(
22            span,
23            "expected at least one handler for default 404 fallback",
24        ))?;
25
26        let el = self.set.remove(pos);
27        Ok(el.expr)
28    }
29
30    pub fn into_expr(self) -> Vec<Expr> {
31        self.set.into_iter().map(|el| el.expr).collect()
32    }
33}
34
35pub struct Handler {
36    expr: Expr,
37    pub default: bool,
38}
39
40impl Parse for Handler {
41    fn parse(input: ParseStream) -> Result<Self> {
42        let default = input
43            .call(Attribute::parse_outer)
44            .map(|attrs| {
45                attrs
46                    .into_iter()
47                    .any(|attr| attr.path().is_ident("default"))
48            })
49            .unwrap_or_default();
50
51        let expr: Expr = input.parse()?;
52
53        if !input.is_empty() {
54            let _: Token!(,) = input.parse()?;
55        }
56
57        Ok(Handler { expr, default })
58    }
59}