diff --git a/crates/ruma-macros/src/identifiers.rs b/crates/ruma-macros/src/identifiers.rs index 10ebef4a..fbeec4d8 100644 --- a/crates/ruma-macros/src/identifiers.rs +++ b/crates/ruma-macros/src/identifiers.rs @@ -586,6 +586,42 @@ fn expand_checked_impls(input: &ItemStruct, validate: Path) -> TokenStream { } } + #[automatically_derived] + impl<'a, #generic_params> std::convert::TryFrom<&'a serde_json::Value> for &'a #id_ty { + type Error = crate::IdParseError; + + fn try_from(v: &'a serde_json::Value) -> Result { + v.as_str().unwrap_or_default().try_into() + } + } + + #[automatically_derived] + impl<'a, #generic_params> std::convert::TryFrom<&'a crate::CanonicalJsonValue> for &'a #id_ty { + type Error = crate::IdParseError; + + fn try_from(v: &'a crate::CanonicalJsonValue) -> Result { + v.as_str().unwrap_or_default().try_into() + } + } + + #[automatically_derived] + impl<'a, #generic_params> std::convert::TryFrom> for &'a #id_ty { + type Error = crate::IdParseError; + + fn try_from(v: Option<&'a serde_json::Value>) -> Result { + v.and_then(|v| v.as_str()).unwrap_or_default().try_into() + } + } + + #[automatically_derived] + impl<'a, #generic_params> std::convert::TryFrom> for &'a #id_ty { + type Error = crate::IdParseError; + + fn try_from(v: Option<&'a crate::CanonicalJsonValue>) -> Result { + v.and_then(|v| v.as_str()).unwrap_or_default().try_into() + } + } + #[automatically_derived] impl #impl_generics std::str::FromStr for Box<#id_ty> { type Err = crate::IdParseError;