fn parse_attr()

in sdk/typespec/typespec_macros/src/model.rs [101:144]


fn parse_attr(attribute: &Attribute, attrs: &mut Attrs) -> Result<()> {
    let Meta::List(meta_list) = &attribute.meta else {
        return Err(Error::new(
            attribute.span(),
            INVALID_TYPESPEC_ATTRIBUTE_MESSAGE,
        ));
    };

    meta_list.parse_nested_meta(|meta| {
        let ident = meta
            .path
            .get_ident()
            .ok_or_else(|| Error::new(attribute.span(), INVALID_TYPESPEC_ATTRIBUTE_MESSAGE))?;
        let value = meta
            .value()
            .map_err(|_| Error::new(attribute.span(), INVALID_TYPESPEC_ATTRIBUTE_MESSAGE))?;

        match ident.to_string().as_str() {
            "crate" => {
                let lit = parse_literal_string(value)?;
                let path = lit.parse().map_err(|_| {
                    Error::new(lit.span(), format!("invalid module path: {}", lit.value()))
                })?;
                attrs.typespec_path = Some(path);
                Ok(())
            }
            "format" => {
                let lit = parse_literal_string(value)?;
                attrs.format = Some(match lit.value().as_str() {
                    "json" => Format::Json,
                    "xml" => Format::Xml,
                    x => {
                        return Err(Error::new(lit.span(), format!("Unknown format '{}'", x)));
                    }
                });
                Ok(())
            }
            x => Err(Error::new(
                meta.path.span(),
                format!("unknown typespec attribute '#[typespec({})'", x),
            )),
        }
    })
}