From f485a0265c67a59df75fc6686787538172fa4cac Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Thu, 3 Oct 2024 01:47:27 +0000 Subject: [PATCH] Support `let sender: &UserId = value.get("sender").try_into()?;` Signed-off-by: Jason Volk --- crates/ruma-macros/src/identifiers.rs | 36 +++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) 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;