gateway_common/support/
mod.rs

1#[macro_export]
2macro_rules! fusen_attr {
3    (
4    $name:ident,
5    $($req:ident),*
6    ) => {
7        #[derive(Default)]
8        struct $name {
9            $(
10                $req : Option<String>
11            ),*
12        }
13        impl $name {
14            fn from_attr(args: TokenStream) -> Result<$name, syn::Error> {
15                syn::punctuated::Punctuated::<syn::Meta, syn::Token![,]>::parse_terminated
16                .parse2(args.into())
17                .and_then(|args| Self::build_attr(args))
18            }
19
20            fn build_attr(args: syn::punctuated::Punctuated::<syn::Meta, syn::Token![,]>) -> Result<$name, syn::Error> {
21                let mut methods_name = String::new();
22                $(
23                    let mut $req  = None;
24                    methods_name.push_str("`");
25                    methods_name.push_str(stringify!($req));
26                    methods_name.push_str("`");
27                    methods_name.push_str(", ");
28
29                )*
30
31                for arg in args {
32                    match arg {
33                        syn::Meta::NameValue(namevalue) => {
34                            let ident = namevalue
35                                .path
36                                .get_ident()
37                                .ok_or_else(|| {
38                                    syn::Error::new_spanned(&namevalue, "Must have specified ident")
39                                })?
40                                .to_string()
41                                .to_lowercase();
42                            let lit = match &namevalue.value {
43                                syn::Expr::Lit(syn::ExprLit { lit, .. }) => lit.to_token_stream().to_string(),
44                                expr => expr.to_token_stream().to_string(),
45                            }
46                            .replace("\"", "");
47                            match ident.as_str() {
48                                $(
49                                    stringify!($req) => {
50                                        let _ = $req.insert(lit);
51                                    }
52                                )*
53                                name => {
54                                    let msg = format!(
55                                        "Unknown attribute {} is specified; expected one of: {} ",
56                                        name,&methods_name[..(methods_name.len()-2)],
57                                    );
58                                    return Err(syn::Error::new_spanned(namevalue, msg));
59                                }
60                            }
61                        }
62                        other => {
63                            return Err(syn::Error::new_spanned(
64                                other,
65                                "Unknown attribute inside the macro",
66                            ));
67                        }
68                    }
69                }
70                Ok($name{
71                    $(
72                        $req,
73                    )*
74                })
75            }
76        }
77    }
78}