From 0b5e91d4300ec08625f242a3e6e4c2692ba4b272 Mon Sep 17 00:00:00 2001 From: Thomas Bahn Date: Thu, 8 Oct 2015 14:29:22 +0200 Subject: [PATCH] feat: Add deserializers that use visitors. This deserializers can be used to delegate deserialization to another type's visitor. Example: ```json fn visit_map(&mut self, visitor: V) -> Result where V: de::MapVisitor { let mut deserializer = de::value::MapVisitorDeserializer::new(visitor); try!(Deserialize::deserialize(&mut deserializer)) } ``` --- serde/src/de/value.rs | 64 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/serde/src/de/value.rs b/serde/src/de/value.rs index a4502264..0a5fe4fc 100644 --- a/serde/src/de/value.rs +++ b/serde/src/de/value.rs @@ -362,6 +362,38 @@ impl ValueDeserializer for HashSet /////////////////////////////////////////////////////////////////////////////// +/// A helper deserializer that deserializes a sequence using a `SeqVisitor`. +pub struct SeqVisitorDeserializer { + visitor: V_, + marker: PhantomData, +} + +impl SeqVisitorDeserializer + where V_: de::SeqVisitor, + E: de::Error, +{ + /// Construct a new `SeqVisitorDeserializer`. + pub fn new(visitor: V_) -> Self { + SeqVisitorDeserializer{ + visitor: visitor, + marker: PhantomData + } + } +} + +impl de::Deserializer for SeqVisitorDeserializer + where V_: de::SeqVisitor, + E: de::Error, +{ + type Error = E; + + fn visit(&mut self, mut visitor: V) -> Result { + visitor.visit_seq(&mut self.visitor) + } +} + +/////////////////////////////////////////////////////////////////////////////// + /// A helper deserializer that deserializes a map. pub struct MapDeserializer where I: Iterator, @@ -484,6 +516,38 @@ impl ValueDeserializer for HashMap /////////////////////////////////////////////////////////////////////////////// +/// A helper deserializer that deserializes a map using a `MapVisitor`. +pub struct MapVisitorDeserializer { + visitor: V_, + marker: PhantomData, +} + +impl MapVisitorDeserializer + where V_: de::MapVisitor, + E: de::Error, +{ + /// Construct a new `MapVisitorDeserializer`. + pub fn new(visitor: V_) -> Self { + MapVisitorDeserializer{ + visitor: visitor, + marker: PhantomData + } + } +} + +impl de::Deserializer for MapVisitorDeserializer + where V_: de::MapVisitor, + E: de::Error, +{ + type Error = E; + + fn visit(&mut self, mut visitor: V) -> Result { + visitor.visit_map(&mut self.visitor) + } +} + +/////////////////////////////////////////////////////////////////////////////// + impl<'a, E> ValueDeserializer for bytes::Bytes<'a> where E: de::Error, {