gateway_common/support/
mod.rs1#[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}