fn parse()

in uniffi_internal_macros/src/ir/parse.rs [17:67]


    fn parse(input: ParseStream) -> syn::Result<Self> {
        let attrs = input.parse()?;
        let vis = input.parse()?;
        let lookahead = input.lookahead1();
        if lookahead.peek(Token![struct]) {
            let _: Token![struct] = input.parse()?;
            let ident = input.parse()?;
            let generics = input.parse()?;
            let fields: Fields = input.parse()?;
            if fields.not_named() {
                let _: Token![;] = input.parse()?;
            }
            let mut wraps_field = None;
            for f in fields.iter() {
                if f.attrs.wraps {
                    if wraps_field.is_some() {
                        return Err(syn::Error::new(f.var_name.span(), "Multiple wraps"));
                    } else {
                        wraps_field = Some(f.clone());
                    }
                }
            }
            let st = Struct {
                fields,
                wraps_field,
            };
            Ok(Self {
                attrs,
                vis,
                ident,
                generics,
                def: NodeDef::Struct(st),
            })
        } else if lookahead.peek(Token![enum]) {
            let _: Token![enum] = input.parse()?;
            let ident = input.parse()?;
            let generics = input.parse()?;
            let content;
            braced!(content in input);
            let variants = content.parse_terminated(Variant::parse, Token![,])?;
            Ok(Self {
                attrs,
                vis,
                ident,
                generics,
                def: NodeDef::Enum(variants.into_iter().collect()),
            })
        } else {
            Err(lookahead.error())
        }
    }