From 19b1e0e8fe0b689241566dbf1e370c87cf418379 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Fri, 7 Jul 2023 14:49:25 +0200 Subject: [PATCH 1/3] Revert "Support Deserialization for `VarZeroVec` (#3643)" This reverts commit b2a1b794f3f45a9b95a1709f6f85c56261523994. --- utils/zerovec/src/varzerovec/serde.rs | 124 +++----------------------- 1 file changed, 11 insertions(+), 113 deletions(-) diff --git a/utils/zerovec/src/varzerovec/serde.rs b/utils/zerovec/src/varzerovec/serde.rs index ece4c37cc91..649b29cfb25 100644 --- a/utils/zerovec/src/varzerovec/serde.rs +++ b/utils/zerovec/src/varzerovec/serde.rs @@ -25,32 +25,6 @@ impl Default for VarZeroVecVisitor { } } -struct VarZeroSliceBoxVisitor { - #[allow(clippy::type_complexity)] // this is a private marker type, who cares - marker: PhantomData<(fn() -> Box, F)>, -} - -impl Default for VarZeroSliceBoxVisitor { - fn default() -> Self { - Self { - marker: PhantomData, - } - } -} - -struct VarZeroSliceRefVisitor { - #[allow(clippy::type_complexity)] // this is a private marker type, who cares - marker: PhantomData<(fn() -> Box, F)>, -} - -impl Default for VarZeroSliceRefVisitor { - fn default() -> Self { - Self { - marker: PhantomData, - } - } -} - impl<'de, T, F> Visitor<'de> for VarZeroVecVisitor where T: VarULE + ?Sized, @@ -86,62 +60,6 @@ where } } -impl<'de, T, F> Visitor<'de> for VarZeroSliceBoxVisitor -where - T: VarULE + ?Sized, - Box: Deserialize<'de>, - F: VarZeroVecFormat, -{ - type Value = Box>; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("a sequence or borrowed buffer of bytes") - } - - fn visit_borrowed_bytes(self, bytes: &'de [u8]) -> Result - where - E: de::Error, - { - VarZeroSlice::parse_byte_slice(bytes) - .map(VarULE::to_boxed) - .map_err(de::Error::custom) - } - - fn visit_seq(self, mut seq: A) -> Result - where - A: SeqAccess<'de>, - { - let mut vec: Vec> = if let Some(capacity) = seq.size_hint() { - Vec::with_capacity(capacity) - } else { - Vec::new() - }; - while let Some(value) = seq.next_element::>()? { - vec.push(value); - } - Ok(VarZeroVec::from(&vec).to_boxed()) - } -} - -impl<'de, T, F> Visitor<'de> for VarZeroSliceRefVisitor -where - T: VarULE + ?Sized, - F: VarZeroVecFormat, -{ - type Value = &'de VarZeroSlice; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("a sequence or borrowed buffer of bytes") - } - - fn visit_borrowed_bytes(self, bytes: &'de [u8]) -> Result - where - E: de::Error, - { - VarZeroSlice::parse_byte_slice(bytes).map_err(de::Error::custom) - } -} - /// This impl requires enabling the optional `serde` Cargo feature of the `zerovec` crate impl<'de, 'a, T, F> Deserialize<'de> for VarZeroVec<'a, T, F> where @@ -154,7 +72,7 @@ where where D: Deserializer<'de>, { - let visitor: VarZeroVecVisitor = VarZeroVecVisitor::default(); + let visitor = VarZeroVecVisitor::default(); if deserializer.is_human_readable() { deserializer.deserialize_seq(visitor) } else { @@ -167,6 +85,7 @@ where impl<'de, 'a, T, F> Deserialize<'de> for &'a VarZeroSlice where T: VarULE + ?Sized, + Box: Deserialize<'de>, F: VarZeroVecFormat, 'de: 'a, { @@ -179,30 +98,15 @@ where "&VarZeroSlice cannot be deserialized from human-readable formats", )) } else { - let visitor: VarZeroSliceRefVisitor = VarZeroSliceRefVisitor::default(); - let deserialized: &'a VarZeroSlice<_, _> = deserializer.deserialize_bytes(visitor)?; - Ok(deserialized) - } - } -} - -/// This impl requires enabling the optional `serde` Cargo feature of the `zerovec` crate -impl<'de, 'a, T, F> Deserialize<'de> for Box> -where - T: VarULE + ?Sized, - Box: Deserialize<'de>, - F: VarZeroVecFormat, - 'de: 'a, -{ - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - let visitor: VarZeroSliceBoxVisitor = VarZeroSliceBoxVisitor::default(); - if deserializer.is_human_readable() { - deserializer.deserialize_seq(visitor) - } else { - deserializer.deserialize_bytes(visitor) + let deserialized: VarZeroVec<'a, T, F> = VarZeroVec::deserialize(deserializer)?; + let borrowed = if let VarZeroVec::Borrowed(b) = deserialized { + b + } else { + return Err(de::Error::custom( + "&VarZeroSlice can only deserialize in zero-copy ways", + )); + }; + Ok(borrowed) } } } @@ -256,12 +160,6 @@ mod test { _data: VarZeroVec<'data, str>, } - #[derive(serde::Serialize, serde::Deserialize)] - struct DeriveTest_VarZeroVec_of_VarZeroSlice<'data> { - #[serde(borrow)] - _data: VarZeroVec<'data, VarZeroSlice>, - } - #[derive(serde::Serialize, serde::Deserialize)] struct DeriveTest_VarZeroSlice<'data> { #[serde(borrow)] From 228c99caaf7d90f872ef1b311be0e5cbdca6b8dd Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Fri, 7 Jul 2023 14:52:03 +0200 Subject: [PATCH 2/3] More succinct deserialize impl for Box --- utils/zerovec/src/varzerovec/serde.rs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/utils/zerovec/src/varzerovec/serde.rs b/utils/zerovec/src/varzerovec/serde.rs index 649b29cfb25..501cb83d68c 100644 --- a/utils/zerovec/src/varzerovec/serde.rs +++ b/utils/zerovec/src/varzerovec/serde.rs @@ -72,7 +72,7 @@ where where D: Deserializer<'de>, { - let visitor = VarZeroVecVisitor::default(); + let visitor = VarZeroVecVisitor::::default(); if deserializer.is_human_readable() { deserializer.deserialize_seq(visitor) } else { @@ -98,7 +98,7 @@ where "&VarZeroSlice cannot be deserialized from human-readable formats", )) } else { - let deserialized: VarZeroVec<'a, T, F> = VarZeroVec::deserialize(deserializer)?; + let deserialized = VarZeroVec::<'a, T, F>::deserialize(deserializer)?; let borrowed = if let VarZeroVec::Borrowed(b) = deserialized { b } else { @@ -111,6 +111,22 @@ where } } +/// This impl requires enabling the optional `serde` Cargo feature of the `zerovec` crate +impl<'de, T, F> Deserialize<'de> for Box> +where + T: VarULE + ?Sized, + Box: Deserialize<'de>, + F: VarZeroVecFormat, +{ + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let deserialized = VarZeroVec::::deserialize(deserializer)?; + Ok(crate::ule::encode_varule_to_box(&deserialized)) + } +} + /// This impl requires enabling the optional `serde` Cargo feature of the `zerovec` crate #[cfg(feature = "serde")] impl Serialize for VarZeroVec<'_, T, F> @@ -166,6 +182,12 @@ mod test { _data: &'data VarZeroSlice, } + #[derive(serde::Serialize, serde::Deserialize)] + struct DeriveTest_VarZeroVec_of_VarZeroSlice<'data> { + #[serde(borrow)] + _data: VarZeroVec<'data, VarZeroSlice>, + } + // ["foo", "bar", "baz", "dolor", "quux", "lorem ipsum"]; const BYTES: &[u8] = &[ 6, 0, 0, 0, 0, 0, 3, 0, 6, 0, 9, 0, 14, 0, 18, 0, 102, 111, 111, 98, 97, 114, 98, 97, 122, From bca38673299734285ba82c867997c9a137064503 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Fri, 7 Jul 2023 15:47:41 +0200 Subject: [PATCH 3/3] use better api --- utils/zerovec/src/varzerovec/serde.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/zerovec/src/varzerovec/serde.rs b/utils/zerovec/src/varzerovec/serde.rs index 501cb83d68c..8025fc085b4 100644 --- a/utils/zerovec/src/varzerovec/serde.rs +++ b/utils/zerovec/src/varzerovec/serde.rs @@ -123,7 +123,7 @@ where D: Deserializer<'de>, { let deserialized = VarZeroVec::::deserialize(deserializer)?; - Ok(crate::ule::encode_varule_to_box(&deserialized)) + Ok(deserialized.to_boxed()) } }