fn process_path()

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