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())
}
}