From aef136934be5ba062fc0dfb56b6a69a4b07d1a6e Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Thu, 13 Apr 2017 11:11:09 -0700 Subject: [PATCH] Implement Clone for the value deserializers --- serde/src/de/value.rs | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/serde/src/de/value.rs b/serde/src/de/value.rs index 6e2993e4..9c5f9195 100644 --- a/serde/src/de/value.rs +++ b/serde/src/de/value.rs @@ -61,7 +61,7 @@ impl<'de, E> IntoDeserializer<'de, E> for () } /// A helper deserializer that deserializes a `()`. -#[derive(Debug)] +#[derive(Clone, Debug)] pub struct UnitDeserializer { marker: PhantomData, } @@ -95,7 +95,7 @@ impl<'de, E> de::Deserializer<'de> for UnitDeserializer macro_rules! primitive_deserializer { ($ty:ty, $name:ident, $method:ident $($cast:tt)*) => { /// A helper deserializer that deserializes a number. - #[derive(Debug)] + #[derive(Clone, Debug)] pub struct $name { value: $ty, marker: PhantomData @@ -149,7 +149,7 @@ primitive_deserializer!(f64, F64Deserializer, visit_f64); primitive_deserializer!(char, CharDeserializer, visit_char); /// A helper deserializer that deserializes a number. -#[derive(Debug)] +#[derive(Clone, Debug)] pub struct U32Deserializer { value: u32, marker: PhantomData, @@ -212,7 +212,7 @@ impl<'de, E> de::EnumVisitor<'de> for U32Deserializer /////////////////////////////////////////////////////////////////////////////// /// A helper deserializer that deserializes a `&str`. -#[derive(Debug)] +#[derive(Clone, Debug)] pub struct StrDeserializer<'a, E> { value: &'a str, marker: PhantomData, @@ -276,7 +276,7 @@ impl<'de, 'a, E> de::EnumVisitor<'de> for StrDeserializer<'a, E> /// A helper deserializer that deserializes a `String`. #[cfg(any(feature = "std", feature = "collections"))] -#[derive(Debug)] +#[derive(Clone, Debug)] pub struct StringDeserializer { value: String, marker: PhantomData, @@ -343,7 +343,7 @@ impl<'de, 'a, E> de::EnumVisitor<'de> for StringDeserializer /// A helper deserializer that deserializes a `String`. #[cfg(any(feature = "std", feature = "collections"))] -#[derive(Debug)] +#[derive(Clone, Debug)] pub struct CowStrDeserializer<'a, E> { value: Cow<'a, str>, marker: PhantomData, @@ -412,7 +412,7 @@ impl<'de, 'a, E> de::EnumVisitor<'de> for CowStrDeserializer<'a, E> /////////////////////////////////////////////////////////////////////////////// /// A helper deserializer that deserializes a sequence. -#[derive(Debug)] +#[derive(Clone, Debug)] pub struct SeqDeserializer { iter: iter::Fuse, count: usize, @@ -548,7 +548,7 @@ impl<'de, T, E> IntoDeserializer<'de, E> for HashSet /////////////////////////////////////////////////////////////////////////////// /// A helper deserializer that deserializes a sequence using a `SeqVisitor`. -#[derive(Debug)] +#[derive(Clone, Debug)] pub struct SeqVisitorDeserializer { visitor: V_, } @@ -764,6 +764,27 @@ impl<'de, I, E> de::SeqVisitor<'de> for MapDeserializer<'de, I, E> } } +// Cannot #[derive(Clone)] because of the bound: +// +// ::Second: Clone +impl<'de, I, E> Clone for MapDeserializer<'de, I, E> + where I: Iterator + Clone, + I::Item: private::Pair, + ::First: IntoDeserializer<'de, E>, + ::Second: IntoDeserializer<'de, E> + Clone, + E: de::Error +{ + fn clone(&self) -> Self { + MapDeserializer { + iter: self.iter.clone(), + value: self.value.clone(), + count: self.count, + lifetime: self.lifetime, + error: self.error, + } + } +} + // Cannot #[derive(Debug)] because of the bound: // // ::Second: Debug @@ -912,7 +933,7 @@ impl<'de, K, V, E> IntoDeserializer<'de, E> for HashMap /////////////////////////////////////////////////////////////////////////////// /// A helper deserializer that deserializes a map using a `MapVisitor`. -#[derive(Debug)] +#[derive(Clone, Debug)] pub struct MapVisitorDeserializer { visitor: V_, } @@ -951,7 +972,7 @@ mod private { use de::{self, Unexpected}; - #[derive(Debug)] + #[derive(Clone, Debug)] pub struct UnitOnly { marker: PhantomData, }