in uniffi_macros/src/export/attributes.rs [273:322]
fn process_path(&mut self, path: &Path, attr: &Attribute, meta: &Meta) -> syn::Result<()> {
let segs = &path.segments;
let fst = segs
.first()
.expect("attributes have at least one path segment");
if fst.ident != "uniffi" {
return Ok(());
}
ensure_no_path_args(fst)?;
let args = match meta {
Meta::List(_) => attr.parse_args::<ExportFnArgs>()?,
_ => Default::default(),
};
self.args = args;
if segs.len() != 2 {
return Err(syn::Error::new_spanned(
segs,
"unsupported uniffi attribute",
));
}
let snd = &segs[1];
ensure_no_path_args(snd)?;
match snd.ident.to_string().as_str() {
"constructor" => {
if self.constructor {
return Err(syn::Error::new_spanned(
attr,
"duplicate constructor attribute",
));
}
self.constructor = true;
}
"method" => {
if self.constructor {
return Err(syn::Error::new_spanned(
attr,
"confused constructor/method attributes",
));
}
}
_ => return Err(syn::Error::new_spanned(snd, "unknown uniffi attribute")),
}
Ok(())
}