summaryrefslogtreecommitdiff
path: root/engine-macros/src/reflection/options_attr.rs
blob: 231b969a86317c522ce954d1541b3201ed58e868 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#[derive(Debug, Default)]
pub struct OptionsAttr
{
    pub impl_with_generics:
        syn::punctuated::Punctuated<syn::AngleBracketedGenericArguments, syn::Token![,]>,
}

impl syn::parse::Parse for OptionsAttr
{
    fn parse(input: syn::parse::ParseStream) -> syn::Result<Self>
    {
        let params =
            input.parse_terminated(|param| param.parse::<syn::Meta>(), syn::Token![,])?;

        let mut impl_with_generics = syn::punctuated::Punctuated::new();

        for param in params {
            let param = param.require_list()?;

            if !param.path.is_ident("impl_with_generics") {
                return Err(syn::Error::new_spanned(
                    param,
                    "Unrecognized attribute parameter",
                ));
            }

            impl_with_generics = param.parse_args_with(
                syn::punctuated::Punctuated::<
                    syn::AngleBracketedGenericArguments,
                    syn::Token![,],
                >::parse_terminated,
            )?;
        }

        Ok(Self { impl_with_generics })
    }
}