From 2e821eab4bb2c0d8314508d61322dc400d918f1b Mon Sep 17 00:00:00 2001 From: Mingun Date: Sat, 3 Oct 2020 16:30:19 +0500 Subject: [PATCH 1/2] Make impl IntoDeserializer for &[u8] public --- serde/src/de/value.rs | 45 +++++++++++++++++++++++++++++++++++++++++ serde/src/private/de.rs | 31 ++-------------------------- 2 files changed, 47 insertions(+), 29 deletions(-) diff --git a/serde/src/de/value.rs b/serde/src/de/value.rs index d0a185da2..2b045e835 100644 --- a/serde/src/de/value.rs +++ b/serde/src/de/value.rs @@ -665,6 +665,51 @@ where //////////////////////////////////////////////////////////////////////////////// +/// A deserializer holding a `&[u8]`. +#[derive(Debug)] +pub struct BytesDeserializer<'a, E> { + value: &'a [u8], + marker: PhantomData, +} + +impl_copy_clone!(BytesDeserializer<'de>); + +impl<'de, 'a, E> IntoDeserializer<'de, E> for &'a [u8] +where + E: de::Error, +{ + type Deserializer = BytesDeserializer<'a, E>; + + fn into_deserializer(self) -> BytesDeserializer<'a, E> { + BytesDeserializer { + value: self, + marker: PhantomData, + } + } +} + +impl<'de, 'a, E> de::Deserializer<'de> for BytesDeserializer<'a, E> +where + E: de::Error, +{ + type Error = E; + + fn deserialize_any(self, visitor: V) -> Result + where + V: de::Visitor<'de>, + { + visitor.visit_bytes(self.value) + } + + forward_to_deserialize_any! { + bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str + string bytes byte_buf option unit unit_struct newtype_struct seq + tuple tuple_struct map struct enum identifier ignored_any + } +} + +//////////////////////////////////////////////////////////////////////////////// + /// A deserializer holding a `&[u8]` with a lifetime tied to another /// deserializer. #[derive(Debug)] diff --git a/serde/src/private/de.rs b/serde/src/private/de.rs index bcb964a9c..a9e7cfe50 100644 --- a/serde/src/private/de.rs +++ b/serde/src/private/de.rs @@ -1,6 +1,7 @@ use lib::*; use de::{Deserialize, DeserializeSeed, Deserializer, Error, IntoDeserializer, Visitor}; +use de::value::BytesDeserializer; #[cfg(any(feature = "std", feature = "alloc"))] use de::{MapAccess, Unexpected}; @@ -2592,11 +2593,6 @@ where } } -pub struct BytesDeserializer<'a, E> { - value: &'a [u8], - marker: PhantomData, -} - impl<'a, E> IdentifierDeserializer<'a, E> for &'a [u8] where E: Error, @@ -2604,30 +2600,7 @@ where type Deserializer = BytesDeserializer<'a, E>; fn from(self) -> Self::Deserializer { - BytesDeserializer { - value: self, - marker: PhantomData, - } - } -} - -impl<'de, 'a, E> Deserializer<'de> for BytesDeserializer<'a, E> -where - E: Error, -{ - type Error = E; - - fn deserialize_any(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - visitor.visit_bytes(self.value) - } - - forward_to_deserialize_any! { - bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string - bytes byte_buf option unit unit_struct newtype_struct seq tuple - tuple_struct map struct enum identifier ignored_any + self.into_deserializer() } } From db3074a40f2a43a942882c739bd4facbc6b98c8c Mon Sep 17 00:00:00 2001 From: Mingun Date: Sun, 4 Oct 2020 13:24:56 +0500 Subject: [PATCH 2/2] Implement IntoDeserializer for Cow<[u8]> --- serde/src/de/value.rs | 59 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/serde/src/de/value.rs b/serde/src/de/value.rs index 2b045e835..23758c0c5 100644 --- a/serde/src/de/value.rs +++ b/serde/src/de/value.rs @@ -752,6 +752,65 @@ where //////////////////////////////////////////////////////////////////////////////// +/// A deserializer holding a `Cow<[u8]>`. +#[cfg(any(feature = "std", feature = "alloc"))] +#[derive(Debug)] +pub struct CowBytesDeserializer<'a, E> { + value: Cow<'a, [u8]>, + marker: PhantomData, +} + +#[cfg(any(feature = "std", feature = "alloc"))] +impl<'a, E> Clone for CowBytesDeserializer<'a, E> { + fn clone(&self) -> Self { + CowBytesDeserializer { + value: self.value.clone(), + marker: PhantomData, + } + } +} + +#[cfg(any(feature = "std", feature = "alloc"))] +impl<'de, 'a, E> IntoDeserializer<'de, E> for Cow<'a, [u8]> +where + E: de::Error, +{ + type Deserializer = CowBytesDeserializer<'a, E>; + + fn into_deserializer(self) -> CowBytesDeserializer<'a, E> { + CowBytesDeserializer { + value: self, + marker: PhantomData, + } + } +} + +#[cfg(any(feature = "std", feature = "alloc"))] +impl<'de, 'a, E> de::Deserializer<'de> for CowBytesDeserializer<'a, E> +where + E: de::Error, +{ + type Error = E; + + fn deserialize_any(self, visitor: V) -> Result + where + V: de::Visitor<'de>, + { + match self.value { + Cow::Borrowed(bytes) => visitor.visit_bytes(bytes), + Cow::Owned(bytes) => visitor.visit_byte_buf(bytes), + } + } + + forward_to_deserialize_any! { + bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string + bytes byte_buf option unit unit_struct newtype_struct seq tuple + tuple_struct map struct identifier ignored_any enum + } +} + +//////////////////////////////////////////////////////////////////////////////// + /// A deserializer that iterates over a sequence. #[derive(Clone, Debug)] pub struct SeqDeserializer {