diff --git a/serde/src/de/value.rs b/serde/src/de/value.rs index 2f1951fc..f959517e 100644 --- a/serde/src/de/value.rs +++ b/serde/src/de/value.rs @@ -12,6 +12,7 @@ use std::collections::{ }; use std::hash::Hash; use std::vec; +use std::marker::PhantomData; use de; use bytes; @@ -52,9 +53,9 @@ impl de::Error for Error { /////////////////////////////////////////////////////////////////////////////// /// This trait converts primitive types into a deserializer. -pub trait ValueDeserializer { +pub trait ValueDeserializer { /// The actual deserializer type. - type Deserializer: de::Deserializer; + type Deserializer: de::Deserializer; /// Convert this value into a deserializer. fn into_deserializer(self) -> Self::Deserializer; @@ -62,27 +63,31 @@ pub trait ValueDeserializer { /////////////////////////////////////////////////////////////////////////////// -impl ValueDeserializer for () { - type Deserializer = UnitDeserializer; +impl ValueDeserializer for () + where E: de::Error, +{ + type Deserializer = UnitDeserializer; - fn into_deserializer(self) -> UnitDeserializer { - UnitDeserializer + fn into_deserializer(self) -> UnitDeserializer { + UnitDeserializer(PhantomData) } } /// A helper deserializer that deserializes a `()`. -pub struct UnitDeserializer; +pub struct UnitDeserializer(PhantomData); -impl de::Deserializer for UnitDeserializer { - type Error = Error; +impl de::Deserializer for UnitDeserializer + where E: de::Error +{ + type Error = E; - fn visit(&mut self, mut visitor: V) -> Result + fn visit(&mut self, mut visitor: V) -> Result where V: de::Visitor, { visitor.visit_unit() } - fn visit_option(&mut self, mut visitor: V) -> Result + fn visit_option(&mut self, mut visitor: V) -> Result where V: de::Visitor, { visitor.visit_none() @@ -94,20 +99,24 @@ impl de::Deserializer for UnitDeserializer { macro_rules! primitive_deserializer { ($ty:ty, $name:ident, $method:ident) => { /// A helper deserializer that deserializes a number. - pub struct $name(Option<$ty>); + pub struct $name(Option<$ty>, PhantomData); - impl ValueDeserializer for $ty { - type Deserializer = $name; + impl ValueDeserializer for $ty + where E: de::Error, + { + type Deserializer = $name; - fn into_deserializer(self) -> $name { - $name(Some(self)) + fn into_deserializer(self) -> $name { + $name(Some(self), PhantomData) } } - impl de::Deserializer for $name { - type Error = Error; + impl de::Deserializer for $name + where E: de::Error, + { + type Error = E; - fn visit(&mut self, mut visitor: V) -> Result + fn visit(&mut self, mut visitor: V) -> Result where V: de::Visitor, { match self.0.take() { @@ -137,20 +146,24 @@ primitive_deserializer!(char, CharDeserializer, visit_char); /////////////////////////////////////////////////////////////////////////////// /// A helper deserializer that deserializes a `&str`. -pub struct StrDeserializer<'a>(Option<&'a str>); +pub struct StrDeserializer<'a, E>(Option<&'a str>, PhantomData); -impl<'a> ValueDeserializer for &'a str { - type Deserializer = StrDeserializer<'a>; +impl<'a, E> ValueDeserializer for &'a str + where E: de::Error, +{ + type Deserializer = StrDeserializer<'a, E>; - fn into_deserializer(self) -> StrDeserializer<'a> { - StrDeserializer(Some(self)) + fn into_deserializer(self) -> StrDeserializer<'a, E> { + StrDeserializer(Some(self), PhantomData) } } -impl<'a> de::Deserializer for StrDeserializer<'a> { - type Error = Error; +impl<'a, E> de::Deserializer for StrDeserializer<'a, E> + where E: de::Error, +{ + type Error = E; - fn visit(&mut self, mut visitor: V) -> Result + fn visit(&mut self, mut visitor: V) -> Result where V: de::Visitor, { match self.0.take() { @@ -162,23 +175,25 @@ impl<'a> de::Deserializer for StrDeserializer<'a> { fn visit_enum(&mut self, _name: &str, _variants: &'static [&'static str], - mut visitor: V) -> Result + mut visitor: V) -> Result where V: de::EnumVisitor, { visitor.visit(self) } } -impl<'a> de::VariantVisitor for StrDeserializer<'a> { - type Error = Error; +impl<'a, E> de::VariantVisitor for StrDeserializer<'a, E> + where E: de::Error, +{ + type Error = E; - fn visit_variant(&mut self) -> Result + fn visit_variant(&mut self) -> Result where T: de::Deserialize, { de::Deserialize::deserialize(self) } - fn visit_unit(&mut self) -> Result<(), Error> { + fn visit_unit(&mut self) -> Result<(), Self::Error> { Ok(()) } } @@ -186,20 +201,24 @@ impl<'a> de::VariantVisitor for StrDeserializer<'a> { /////////////////////////////////////////////////////////////////////////////// /// A helper deserializer that deserializes a `String`. -pub struct StringDeserializer(Option); +pub struct StringDeserializer(Option, PhantomData); -impl ValueDeserializer for String { - type Deserializer = StringDeserializer; +impl ValueDeserializer for String + where E: de::Error, +{ + type Deserializer = StringDeserializer; - fn into_deserializer(self) -> StringDeserializer { - StringDeserializer(Some(self)) + fn into_deserializer(self) -> StringDeserializer { + StringDeserializer(Some(self), PhantomData) } } -impl de::Deserializer for StringDeserializer { - type Error = Error; +impl de::Deserializer for StringDeserializer + where E: de::Error, +{ + type Error = E; - fn visit(&mut self, mut visitor: V) -> Result + fn visit(&mut self, mut visitor: V) -> Result where V: de::Visitor, { match self.0.take() { @@ -211,23 +230,25 @@ impl de::Deserializer for StringDeserializer { fn visit_enum(&mut self, _name: &str, _variants: &'static [&'static str], - mut visitor: V) -> Result + mut visitor: V) -> Result where V: de::EnumVisitor, { visitor.visit(self) } } -impl<'a> de::VariantVisitor for StringDeserializer { - type Error = Error; +impl<'a, E> de::VariantVisitor for StringDeserializer + where E: de::Error, +{ + type Error = E; - fn visit_variant(&mut self) -> Result + fn visit_variant(&mut self) -> Result where T: de::Deserialize, { de::Deserialize::deserialize(self) } - fn visit_unit(&mut self) -> Result<(), Error> { + fn visit_unit(&mut self) -> Result<(), Self::Error> { Ok(()) } } @@ -235,41 +256,47 @@ impl<'a> de::VariantVisitor for StringDeserializer { /////////////////////////////////////////////////////////////////////////////// /// A helper deserializer that deserializes a sequence. -pub struct SeqDeserializer { +pub struct SeqDeserializer { iter: I, len: usize, + marker: PhantomData, } -impl SeqDeserializer { +impl SeqDeserializer + where E: de::Error, +{ /// Construct a new `SeqDeserializer`. pub fn new(iter: I, len: usize) -> Self { SeqDeserializer { iter: iter, len: len, + marker: PhantomData, } } } -impl de::Deserializer for SeqDeserializer +impl de::Deserializer for SeqDeserializer where I: Iterator, - T: ValueDeserializer, + T: ValueDeserializer, + E: de::Error, { - type Error = Error; + type Error = E; - fn visit(&mut self, mut visitor: V) -> Result + fn visit(&mut self, mut visitor: V) -> Result where V: de::Visitor, { visitor.visit_seq(self) } } -impl de::SeqVisitor for SeqDeserializer +impl de::SeqVisitor for SeqDeserializer where I: Iterator, - T: ValueDeserializer, + T: ValueDeserializer, + E: de::Error, { - type Error = Error; + type Error = E; - fn visit(&mut self) -> Result, Error> + fn visit(&mut self) -> Result, Self::Error> where V: de::Deserialize { match self.iter.next() { @@ -282,7 +309,7 @@ impl de::SeqVisitor for SeqDeserializer } } - fn end(&mut self) -> Result<(), Error> { + fn end(&mut self) -> Result<(), Self::Error> { if self.len == 0 { Ok(()) } else { @@ -297,34 +324,37 @@ impl de::SeqVisitor for SeqDeserializer /////////////////////////////////////////////////////////////////////////////// -impl ValueDeserializer for Vec - where T: ValueDeserializer, +impl ValueDeserializer for Vec + where T: ValueDeserializer, + E: de::Error, { - type Deserializer = SeqDeserializer>; + type Deserializer = SeqDeserializer, E>; - fn into_deserializer(self) -> SeqDeserializer> { + fn into_deserializer(self) -> Self::Deserializer { let len = self.len(); SeqDeserializer::new(self.into_iter(), len) } } -impl ValueDeserializer for BTreeSet - where T: ValueDeserializer + Eq + Ord, +impl ValueDeserializer for BTreeSet + where T: ValueDeserializer + Eq + Ord, + E: de::Error, { - type Deserializer = SeqDeserializer>; + type Deserializer = SeqDeserializer, E>; - fn into_deserializer(self) -> SeqDeserializer> { + fn into_deserializer(self) -> Self::Deserializer { let len = self.len(); SeqDeserializer::new(self.into_iter(), len) } } -impl ValueDeserializer for HashSet - where T: ValueDeserializer + Eq + Hash, +impl ValueDeserializer for HashSet + where T: ValueDeserializer + Eq + Hash, + E: de::Error, { - type Deserializer = SeqDeserializer>; + type Deserializer = SeqDeserializer, E>; - fn into_deserializer(self) -> SeqDeserializer> { + fn into_deserializer(self) -> Self::Deserializer { let len = self.len(); SeqDeserializer::new(self.into_iter(), len) } @@ -333,20 +363,23 @@ impl ValueDeserializer for HashSet /////////////////////////////////////////////////////////////////////////////// /// A helper deserializer that deserializes a map. -pub struct MapDeserializer +pub struct MapDeserializer where I: Iterator, - K: ValueDeserializer, - V: ValueDeserializer, + K: ValueDeserializer, + V: ValueDeserializer, + E: de::Error, { iter: I, value: Option, len: usize, + marker: PhantomData, } -impl MapDeserializer +impl MapDeserializer where I: Iterator, - K: ValueDeserializer, - V: ValueDeserializer, + K: ValueDeserializer, + V: ValueDeserializer, + E: de::Error, { /// Construct a new `MapDeserializer`. pub fn new(iter: I, len: usize) -> Self { @@ -354,32 +387,35 @@ impl MapDeserializer iter: iter, value: None, len: len, + marker: PhantomData, } } } -impl de::Deserializer for MapDeserializer +impl de::Deserializer for MapDeserializer where I: Iterator, - K: ValueDeserializer, - V: ValueDeserializer, + K: ValueDeserializer, + V: ValueDeserializer, + E: de::Error, { - type Error = Error; + type Error = E; - fn visit(&mut self, mut visitor: V_) -> Result + fn visit(&mut self, mut visitor: V_) -> Result where V_: de::Visitor, { visitor.visit_map(self) } } -impl de::MapVisitor for MapDeserializer +impl de::MapVisitor for MapDeserializer where I: Iterator, - K: ValueDeserializer, - V: ValueDeserializer, + K: ValueDeserializer, + V: ValueDeserializer, + E: de::Error, { - type Error = Error; + type Error = E; - fn visit_key(&mut self) -> Result, Error> + fn visit_key(&mut self) -> Result, Self::Error> where T: de::Deserialize, { match self.iter.next() { @@ -393,7 +429,7 @@ impl de::MapVisitor for MapDeserializer } } - fn visit_value(&mut self) -> Result + fn visit_value(&mut self) -> Result where T: de::Deserialize, { match self.value.take() { @@ -405,7 +441,7 @@ impl de::MapVisitor for MapDeserializer } } - fn end(&mut self) -> Result<(), Error> { + fn end(&mut self) -> Result<(), Self::Error> { if self.len == 0 { Ok(()) } else { @@ -420,25 +456,27 @@ impl de::MapVisitor for MapDeserializer /////////////////////////////////////////////////////////////////////////////// -impl ValueDeserializer for BTreeMap - where K: ValueDeserializer + Eq + Ord, - V: ValueDeserializer, +impl ValueDeserializer for BTreeMap + where K: ValueDeserializer + Eq + Ord, + V: ValueDeserializer, + E: de::Error, { - type Deserializer = MapDeserializer, K, V>; + type Deserializer = MapDeserializer, K, V, E>; - fn into_deserializer(self) -> MapDeserializer, K, V> { + fn into_deserializer(self) -> Self::Deserializer { let len = self.len(); MapDeserializer::new(self.into_iter(), len) } } -impl ValueDeserializer for HashMap - where K: ValueDeserializer + Eq + Hash, - V: ValueDeserializer, +impl ValueDeserializer for HashMap + where K: ValueDeserializer + Eq + Hash, + V: ValueDeserializer, + E: de::Error, { - type Deserializer = MapDeserializer, K, V>; + type Deserializer = MapDeserializer, K, V, E>; - fn into_deserializer(self) -> MapDeserializer, K, V> { + fn into_deserializer(self) -> Self::Deserializer { let len = self.len(); MapDeserializer::new(self.into_iter(), len) } @@ -446,22 +484,25 @@ impl ValueDeserializer for HashMap /////////////////////////////////////////////////////////////////////////////// -impl<'a> ValueDeserializer for bytes::Bytes<'a> +impl<'a, E> ValueDeserializer for bytes::Bytes<'a> + where E: de::Error, { - type Deserializer = BytesDeserializer<'a>; + type Deserializer = BytesDeserializer<'a, E>; - fn into_deserializer(self) -> BytesDeserializer<'a> { - BytesDeserializer(Some(self.into())) + fn into_deserializer(self) -> BytesDeserializer<'a, E> { + BytesDeserializer(Some(self.into()), PhantomData) } } /// A helper deserializer that deserializes a `&[u8]`. -pub struct BytesDeserializer<'a> (Option<&'a [u8]>); +pub struct BytesDeserializer<'a, E> (Option<&'a [u8]>, PhantomData); -impl<'a> de::Deserializer for BytesDeserializer<'a> { - type Error = Error; +impl<'a, E> de::Deserializer for BytesDeserializer<'a, E> + where E: de::Error +{ + type Error = E; - fn visit(&mut self, mut visitor: V) -> Result + fn visit(&mut self, mut visitor: V) -> Result where V: de::Visitor, { match self.0.take() { @@ -474,22 +515,25 @@ impl<'a> de::Deserializer for BytesDeserializer<'a> { /////////////////////////////////////////////////////////////////////////////// -impl ValueDeserializer for bytes::ByteBuf +impl ValueDeserializer for bytes::ByteBuf + where E: de::Error, { - type Deserializer = ByteBufDeserializer; + type Deserializer = ByteBufDeserializer; fn into_deserializer(self) -> Self::Deserializer { - ByteBufDeserializer(Some(self.into())) + ByteBufDeserializer(Some(self.into()), PhantomData) } } /// A helper deserializer that deserializes a `Vec`. -pub struct ByteBufDeserializer(Option>); +pub struct ByteBufDeserializer(Option>, PhantomData); -impl de::Deserializer for ByteBufDeserializer { - type Error = Error; +impl de::Deserializer for ByteBufDeserializer + where E: de::Error, +{ + type Error = E; - fn visit(&mut self, mut visitor: V) -> Result + fn visit(&mut self, mut visitor: V) -> Result where V: de::Visitor, { match self.0.take() {