From e68888d4756f643b25c374fffe3fcaf0469c1f9b Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Sat, 4 Feb 2017 10:00:04 +0100 Subject: [PATCH] remove possible sublte ambiguity with `.into_deserializer` --- serde/src/de/content.rs | 62 ++++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 26 deletions(-) diff --git a/serde/src/de/content.rs b/serde/src/de/content.rs index 5876f615..7b27fdd6 100644 --- a/serde/src/de/content.rs +++ b/serde/src/de/content.rs @@ -18,8 +18,6 @@ use de::{ EnumVisitor, }; -use de::value::ValueDeserializer; - /// Used from generated code to buffer the contents of the Deserializer when /// deserializing untagged enums and internally tagged enums. /// @@ -527,17 +525,17 @@ impl Deserializer for ContentDeserializer Content::String(v) => visitor.visit_string(v), Content::Unit => visitor.visit_unit(), Content::None => visitor.visit_none(), - Content::Some(v) => visitor.visit_some(v.into_deserializer()), - Content::Newtype(v) => visitor.visit_newtype_struct(v.into_deserializer()), + Content::Some(v) => visitor.visit_some(ContentDeserializer::new(*v)), + Content::Newtype(v) => visitor.visit_newtype_struct(ContentDeserializer::new(*v)), Content::Seq(v) => { - let seq = v.into_iter(); + let seq = v.into_iter().map(ContentDeserializer::new); let mut seq_visitor = de::value::SeqDeserializer::new(seq); let value = try!(visitor.visit_seq(&mut seq_visitor)); try!(seq_visitor.end()); Ok(value) }, Content::Map(v) => { - let map = v.into_iter(); + let map = v.into_iter().map(|(k, v)| (ContentDeserializer::new(k), ContentDeserializer::new(v))); let mut map_visitor = de::value::MapDeserializer::new(map); let value = try!(visitor.visit_map(&mut map_visitor)); try!(map_visitor.end()); @@ -552,7 +550,7 @@ impl Deserializer for ContentDeserializer { match self.content { Content::None => visitor.visit_none(), - Content::Some(v) => visitor.visit_some(v.into_deserializer()), + Content::Some(v) => visitor.visit_some(ContentDeserializer::new(*v)), Content::Unit => visitor.visit_unit(), _ => visitor.visit_some(self) } @@ -571,14 +569,10 @@ impl Deserializer for ContentDeserializer } } -impl de::value::ValueDeserializer for Content - where E: de::Error -{ - type Deserializer = ContentDeserializer; - - fn into_deserializer(self) -> Self::Deserializer { +impl ContentDeserializer { + fn new(content: Content) -> Self { ContentDeserializer { - content: self, + content: content, err: PhantomData, } } @@ -616,17 +610,17 @@ impl<'a, E> Deserializer for ContentRefDeserializer<'a, E> Content::String(ref v) => visitor.visit_str(v), Content::Unit => visitor.visit_unit(), Content::None => visitor.visit_none(), - Content::Some(ref v) => visitor.visit_some((&**v).into_deserializer()), - Content::Newtype(ref v) => visitor.visit_newtype_struct((&**v).into_deserializer()), + Content::Some(ref v) => visitor.visit_some(ContentRefDeserializer::new(v)), + Content::Newtype(ref v) => visitor.visit_newtype_struct(ContentRefDeserializer::new(v)), Content::Seq(ref v) => { - let seq = v.into_iter(); + let seq = v.into_iter().map(ContentRefDeserializer::new); let mut seq_visitor = de::value::SeqDeserializer::new(seq); let value = try!(visitor.visit_seq(&mut seq_visitor)); try!(seq_visitor.end()); Ok(value) }, Content::Map(ref v) => { - let map = v.into_iter().map(|&(ref k, ref v)| (k, v)); + let map = v.into_iter().map(|&(ref k, ref v)| (ContentRefDeserializer::new(k), ContentRefDeserializer::new(v))); let mut map_visitor = de::value::MapDeserializer::new(map); let value = try!(visitor.visit_map(&mut map_visitor)); try!(map_visitor.end()); @@ -641,7 +635,7 @@ impl<'a, E> Deserializer for ContentRefDeserializer<'a, E> { match *self.content { Content::None => visitor.visit_none(), - Content::Some(ref v) => visitor.visit_some((&**v).into_deserializer()), + Content::Some(ref v) => visitor.visit_some(ContentRefDeserializer::new(v)), Content::Unit => visitor.visit_unit(), _ => visitor.visit_some(self) } @@ -660,19 +654,35 @@ impl<'a, E> Deserializer for ContentRefDeserializer<'a, E> } } -impl<'a, E> de::value::ValueDeserializer for &'a Content - where E: de::Error -{ - type Deserializer = ContentRefDeserializer<'a, E>; - - fn into_deserializer(self) -> Self::Deserializer { +impl<'a, E> ContentRefDeserializer<'a, E> { + fn new(content: &'a Content) -> Self { ContentRefDeserializer { - content: self, + content: content, err: PhantomData, } } } +impl de::value::ValueDeserializer for ContentDeserializer + where E: de::Error +{ + type Deserializer = Self; + + fn into_deserializer(self) -> Self { + self + } +} + +impl<'a, E> de::value::ValueDeserializer for ContentRefDeserializer<'a, E> + where E: de::Error +{ + type Deserializer = Self; + + fn into_deserializer(self) -> Self { + self + } +} + /// Visitor for deserializing an internally tagged unit variant. /// /// Not public API.