diff --git a/git-ref-format/core/src/serde.rs b/git-ref-format/core/src/serde.rs index 47408c5..f492695 100644 --- a/git-ref-format/core/src/serde.rs +++ b/git-ref-format/core/src/serde.rs @@ -42,7 +42,8 @@ impl<'de> Deserialize<'de> for RefString { where D: Deserializer<'de>, { - Deserialize::deserialize(deserializer).map(|x: &RefStr| x.to_owned()) + Deserialize::deserialize(deserializer) + .and_then(|x: String| Self::try_from(x).map_err(de::Error::custom)) } } @@ -83,7 +84,8 @@ impl<'de> Deserialize<'de> for PatternString { where D: Deserializer<'de>, { - Deserialize::deserialize(deserializer).map(|x: &PatternStr| x.to_owned()) + Deserialize::deserialize(deserializer) + .and_then(|x: String| Self::try_from(x).map_err(de::Error::custom)) } } @@ -97,15 +99,17 @@ impl Serialize for PatternString { } } -impl<'de: 'a, 'a> Deserialize<'de> for Qualified<'a> { +impl<'de> Deserialize<'de> for Qualified<'static> { #[inline] fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { - Deserialize::deserialize(deserializer).and_then(|s: &RefStr| { + Deserialize::deserialize(deserializer).and_then(|s: String| { + let s = RefString::try_from(s).map_err(de::Error::custom)?; s.qualified() .ok_or_else(|| de::Error::custom("not a qualified ref")) + .map(|q| q.into_owned()) }) } } @@ -120,15 +124,17 @@ impl Serialize for Qualified<'_> { } } -impl<'de: 'a, 'a> Deserialize<'de> for Namespaced<'a> { +impl<'de> Deserialize<'de> for Namespaced<'static> { #[inline] fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { - Deserialize::deserialize(deserializer).and_then(|s: &RefStr| { + Deserialize::deserialize(deserializer).and_then(|s: String| { + let s = RefString::try_from(s).map_err(de::Error::custom)?; s.to_namespaced() .ok_or_else(|| de::Error::custom("not a namespaced ref")) + .map(|ns| ns.into_owned()) }) } } diff --git a/git-ref-format/t/Cargo.toml b/git-ref-format/t/Cargo.toml index df46ea7..d83a201 100644 --- a/git-ref-format/t/Cargo.toml +++ b/git-ref-format/t/Cargo.toml @@ -19,6 +19,7 @@ proptest = "1" [dev-dependencies] assert_matches = "1.5" +serde_json = "1" [dev-dependencies.git-ref-format] path = ".." diff --git a/git-ref-format/t/src/properties/name.rs b/git-ref-format/t/src/properties/name.rs index b7d9318..2a9b429 100644 --- a/git-ref-format/t/src/properties/name.rs +++ b/git-ref-format/t/src/properties/name.rs @@ -3,7 +3,7 @@ use std::convert::TryFrom; -use git_ref_format::{Error, RefStr, RefString}; +use git_ref_format::{name, refname, Error, RefStr, RefString}; use proptest::prelude::*; use test_helpers::roundtrip; @@ -75,7 +75,22 @@ proptest! { #[test] fn json(input in gen::valid()) { - roundtrip::json(RefString::try_from(input).unwrap()) + let input = RefString::try_from(input).unwrap(); + roundtrip::json(input.clone()); + let qualified = refname!("refs/heads").and(input).qualified().unwrap().into_owned(); + roundtrip::json(qualified.clone()); + let namespaced = qualified.with_namespace(name::component!("foo")); + roundtrip::json(namespaced); + } + + #[test] + fn json_value(input in gen::valid()) { + let input = RefString::try_from(input).unwrap(); + roundtrip::json_value(input.clone()); + let qualified = refname!("refs/heads").and(input).qualified().unwrap().into_owned(); + roundtrip::json_value(qualified.clone()); + let namespaced = qualified.with_namespace(name::component!("foo")); + roundtrip::json_value(namespaced); } #[test] diff --git a/git-ref-format/t/src/properties/pattern.rs b/git-ref-format/t/src/properties/pattern.rs index 4e36d62..6348af8 100644 --- a/git-ref-format/t/src/properties/pattern.rs +++ b/git-ref-format/t/src/properties/pattern.rs @@ -48,6 +48,11 @@ proptest! { roundtrip::json(refspec::PatternString::try_from(input).unwrap()) } + #[test] + fn json_value(input in gen::with_glob()) { + roundtrip::json_value(refspec::PatternString::try_from(input).unwrap()) + } + #[test] fn cbor(input in gen::with_glob()) { roundtrip::cbor(refspec::PatternString::try_from(input).unwrap())