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