in uniffi_udl/src/attributes.rs [60:114]
fn try_from(
weedle_attribute: &weedle::attribute::ExtendedAttribute<'_>,
) -> Result<Self, anyhow::Error> {
match weedle_attribute {
// Matches plain named attributes like "[ByRef"].
weedle::attribute::ExtendedAttribute::NoArgs(attr) => match (attr.0).0 {
"ByRef" => Ok(Attribute::ByRef),
"Enum" => Ok(Attribute::Enum),
"Error" => Ok(Attribute::Error),
"Custom" => Ok(Attribute::Custom { crate_name: None }),
"Trait" => Ok(Attribute::Trait),
"WithForeign" => Ok(Attribute::WithForeign),
"Async" => Ok(Attribute::Async),
"NonExhaustive" => Ok(Attribute::NonExhaustive),
"Remote" => Ok(Attribute::Remote),
_ => anyhow::bail!("ExtendedAttributeNoArgs not supported: {:?}", (attr.0).0),
},
// Matches assignment-style attributes like ["Throws=Error"]
weedle::attribute::ExtendedAttribute::Ident(identity) => {
match identity.lhs_identifier.0 {
"Name" => Ok(Attribute::Name(name_from_id_or_string(&identity.rhs))),
"Throws" => Ok(Attribute::Throws(name_from_id_or_string(&identity.rhs))),
"Self" => Ok(Attribute::SelfType(SelfType::try_from(&identity.rhs)?)),
"External" => Ok(Attribute::External {
crate_name: name_from_id_or_string(&identity.rhs),
}),
"Custom" => Ok(Attribute::Custom {
crate_name: Some(name_from_id_or_string(&identity.rhs)),
}),
_ => anyhow::bail!(
"Attribute identity Identifier not supported: {:?}",
identity.lhs_identifier.0
),
}
}
weedle::attribute::ExtendedAttribute::IdentList(attr_list) => {
match attr_list.identifier.0 {
"Traits" => Ok(Attribute::Traits(
attr_list
.list
.body
.list
.iter()
.map(|i| i.0.to_string())
.collect(),
)),
_ => anyhow::bail!(
"Attribute identity list not supported: {:?}",
attr_list.identifier.0
),
}
}
_ => anyhow::bail!("Attribute not supported: {:?}", weedle_attribute),
}
}