remove possible sublte ambiguity with .into_deserializer

This commit is contained in:
Oliver Schneider
2017-02-04 10:00:04 +01:00
parent 6277079152
commit e68888d475
+36 -26
View File
@@ -18,8 +18,6 @@ use de::{
EnumVisitor, EnumVisitor,
}; };
use de::value::ValueDeserializer;
/// Used from generated code to buffer the contents of the Deserializer when /// Used from generated code to buffer the contents of the Deserializer when
/// deserializing untagged enums and internally tagged enums. /// deserializing untagged enums and internally tagged enums.
/// ///
@@ -527,17 +525,17 @@ impl<E> Deserializer for ContentDeserializer<E>
Content::String(v) => visitor.visit_string(v), Content::String(v) => visitor.visit_string(v),
Content::Unit => visitor.visit_unit(), Content::Unit => visitor.visit_unit(),
Content::None => visitor.visit_none(), Content::None => visitor.visit_none(),
Content::Some(v) => visitor.visit_some(v.into_deserializer()), Content::Some(v) => visitor.visit_some(ContentDeserializer::new(*v)),
Content::Newtype(v) => visitor.visit_newtype_struct(v.into_deserializer()), Content::Newtype(v) => visitor.visit_newtype_struct(ContentDeserializer::new(*v)),
Content::Seq(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 mut seq_visitor = de::value::SeqDeserializer::new(seq);
let value = try!(visitor.visit_seq(&mut seq_visitor)); let value = try!(visitor.visit_seq(&mut seq_visitor));
try!(seq_visitor.end()); try!(seq_visitor.end());
Ok(value) Ok(value)
}, },
Content::Map(v) => { 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 mut map_visitor = de::value::MapDeserializer::new(map);
let value = try!(visitor.visit_map(&mut map_visitor)); let value = try!(visitor.visit_map(&mut map_visitor));
try!(map_visitor.end()); try!(map_visitor.end());
@@ -552,7 +550,7 @@ impl<E> Deserializer for ContentDeserializer<E>
{ {
match self.content { match self.content {
Content::None => visitor.visit_none(), 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(), Content::Unit => visitor.visit_unit(),
_ => visitor.visit_some(self) _ => visitor.visit_some(self)
} }
@@ -571,14 +569,10 @@ impl<E> Deserializer for ContentDeserializer<E>
} }
} }
impl<E> de::value::ValueDeserializer<E> for Content impl<E> ContentDeserializer<E> {
where E: de::Error fn new(content: Content) -> Self {
{
type Deserializer = ContentDeserializer<E>;
fn into_deserializer(self) -> Self::Deserializer {
ContentDeserializer { ContentDeserializer {
content: self, content: content,
err: PhantomData, err: PhantomData,
} }
} }
@@ -616,17 +610,17 @@ impl<'a, E> Deserializer for ContentRefDeserializer<'a, E>
Content::String(ref v) => visitor.visit_str(v), Content::String(ref v) => visitor.visit_str(v),
Content::Unit => visitor.visit_unit(), Content::Unit => visitor.visit_unit(),
Content::None => visitor.visit_none(), 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::Newtype(ref v) => visitor.visit_newtype_struct((&**v).into_deserializer()), Content::Newtype(ref v) => visitor.visit_newtype_struct(ContentRefDeserializer::new(v)),
Content::Seq(ref 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 mut seq_visitor = de::value::SeqDeserializer::new(seq);
let value = try!(visitor.visit_seq(&mut seq_visitor)); let value = try!(visitor.visit_seq(&mut seq_visitor));
try!(seq_visitor.end()); try!(seq_visitor.end());
Ok(value) Ok(value)
}, },
Content::Map(ref v) => { 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 mut map_visitor = de::value::MapDeserializer::new(map);
let value = try!(visitor.visit_map(&mut map_visitor)); let value = try!(visitor.visit_map(&mut map_visitor));
try!(map_visitor.end()); try!(map_visitor.end());
@@ -641,7 +635,7 @@ impl<'a, E> Deserializer for ContentRefDeserializer<'a, E>
{ {
match *self.content { match *self.content {
Content::None => visitor.visit_none(), 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(), Content::Unit => visitor.visit_unit(),
_ => visitor.visit_some(self) _ => visitor.visit_some(self)
} }
@@ -660,19 +654,35 @@ impl<'a, E> Deserializer for ContentRefDeserializer<'a, E>
} }
} }
impl<'a, E> de::value::ValueDeserializer<E> for &'a Content impl<'a, E> ContentRefDeserializer<'a, E> {
where E: de::Error fn new(content: &'a Content) -> Self {
{
type Deserializer = ContentRefDeserializer<'a, E>;
fn into_deserializer(self) -> Self::Deserializer {
ContentRefDeserializer { ContentRefDeserializer {
content: self, content: content,
err: PhantomData, err: PhantomData,
} }
} }
} }
impl<E> de::value::ValueDeserializer<E> for ContentDeserializer<E>
where E: de::Error
{
type Deserializer = Self;
fn into_deserializer(self) -> Self {
self
}
}
impl<'a, E> de::value::ValueDeserializer<E> 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. /// Visitor for deserializing an internally tagged unit variant.
/// ///
/// Not public API. /// Not public API.