From 6624dffe256c8a1a0782ad0f64d9992a9dae5e30 Mon Sep 17 00:00:00 2001 From: pep Date: Wed, 31 Dec 2025 23:07:33 +0100 Subject: [PATCH] jid: Allow for deserializers which cannot provide borrowed strings skip-changelog: already in there. Signed-off-by: pep --- jid/src/parts.rs | 48 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/jid/src/parts.rs b/jid/src/parts.rs index 58928cfbd28182dea9477a12a64357acf28bb985..a61c0bef4af16f9496aa0d50c7c38823bc36e2f6 100644 --- a/jid/src/parts.rs +++ b/jid/src/parts.rs @@ -46,40 +46,40 @@ macro_rules! def_part_into_inner_doc { #[cfg(feature = "serde")] #[derive(Deserialize)] -struct NodeDeserializer<'a>(&'a str); +struct NodeDeserializer<'a>(Cow<'a, str>); #[cfg(feature = "serde")] impl TryFrom> for NodePart { type Error = Error; fn try_from(deserializer: NodeDeserializer) -> Result { - Ok(NodePart::new(deserializer.0)?.into_owned()) + Ok(NodePart::new(&deserializer.0)?.into_owned()) } } #[cfg(feature = "serde")] #[derive(Deserialize)] -struct DomainDeserializer<'a>(&'a str); +struct DomainDeserializer<'a>(Cow<'a, str>); #[cfg(feature = "serde")] impl TryFrom> for DomainPart { type Error = Error; fn try_from(deserializer: DomainDeserializer) -> Result { - Ok(DomainPart::new(deserializer.0)?.into_owned()) + Ok(DomainPart::new(&deserializer.0)?.into_owned()) } } #[cfg(feature = "serde")] #[derive(Deserialize)] -struct ResourceDeserializer<'a>(&'a str); +struct ResourceDeserializer<'a>(Cow<'a, str>); #[cfg(feature = "serde")] impl TryFrom> for ResourcePart { type Error = Error; fn try_from(deserializer: ResourceDeserializer) -> Result { - Ok(ResourcePart::new(deserializer.0)?.into_owned()) + Ok(ResourcePart::new(&deserializer.0)?.into_owned()) } } @@ -350,6 +350,18 @@ mod tests { ], ); + serde_test::assert_de_tokens( + &NodePart(String::from("test")), + &[ + serde_test::Token::TupleStruct { + name: "NodePart", + len: 1, + }, + serde_test::Token::String("test"), + serde_test::Token::TupleStructEnd, + ], + ); + serde_test::assert_de_tokens_error::( &[ serde_test::Token::TupleStruct { @@ -378,6 +390,18 @@ mod tests { ], ); + serde_test::assert_de_tokens( + &DomainPart(String::from("[::1]")), + &[ + serde_test::Token::TupleStruct { + name: "DomainPart", + len: 1, + }, + serde_test::Token::String("[::1]"), + serde_test::Token::TupleStructEnd, + ], + ); + serde_test::assert_de_tokens( &DomainPart(String::from("domain.example")), &[ @@ -418,6 +442,18 @@ mod tests { ], ); + serde_test::assert_de_tokens( + &ResourcePart(String::from("test")), + &[ + serde_test::Token::TupleStruct { + name: "ResourcePart", + len: 1, + }, + serde_test::Token::String("test"), + serde_test::Token::TupleStructEnd, + ], + ); + serde_test::assert_de_tokens_error::( &[ serde_test::Token::TupleStruct {