jid: Allow for deserializers which cannot provide borrowed strings

skip-changelog: already in there.

Signed-off-by: pep <pep@bouah.net>
This commit is contained in:
pep 2025-12-31 23:07:33 +01:00
commit 6624dffe25
No known key found for this signature in database
GPG key ID: DEDA74AEECA9D0F2

View file

@ -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<NodeDeserializer<'_>> for NodePart {
type Error = Error;
fn try_from(deserializer: NodeDeserializer) -> Result<NodePart, Self::Error> {
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<DomainDeserializer<'_>> for DomainPart {
type Error = Error;
fn try_from(deserializer: DomainDeserializer) -> Result<DomainPart, Self::Error> {
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<ResourceDeserializer<'_>> for ResourcePart {
type Error = Error;
fn try_from(deserializer: ResourceDeserializer) -> Result<ResourcePart, Self::Error> {
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::<NodePart>(
&[
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::<ResourcePart>(
&[
serde_test::Token::TupleStruct {