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