diff options
Diffstat (limited to 'src/de/mod.rs')
-rw-r--r-- | src/de/mod.rs | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/de/mod.rs b/src/de/mod.rs index f882ae7..969351e 100644 --- a/src/de/mod.rs +++ b/src/de/mod.rs @@ -45,6 +45,7 @@ use serde::de::IntoDeserializer; use std::borrow::Cow; use std::collections::btree_map::{BTreeMap, Entry, IntoIter}; +use std::iter::Peekable; /// To override the default serialization parameters, first construct a new /// Config. @@ -196,7 +197,7 @@ pub fn from_str<'de, T: de::Deserialize<'de>>(input: &'de str) -> Result<T> { /// /// Supported top-level outputs are structs and maps. pub struct QsDeserializer<'a> { - iter: IntoIter<Cow<'a, str>, Level<'a>>, + iter: Peekable<IntoIter<Cow<'a, str>, Level<'a>>>, value: Option<Level<'a>>, } @@ -213,7 +214,7 @@ enum Level<'a> { impl<'a> QsDeserializer<'a> { fn with_map(map: BTreeMap<Cow<'a, str>, Level<'a>>) -> Self { QsDeserializer { - iter: map.into_iter(), + iter: map.into_iter().peekable(), value: None, } } @@ -235,11 +236,11 @@ impl<'de> de::Deserializer<'de> for QsDeserializer<'de> { where V: de::Visitor<'de>, { - if self.iter.next().is_none() { - return visitor.visit_unit(); + if self.iter.peek().is_none() { + visitor.visit_unit() + } else { + self.deserialize_map(visitor) } - - Err(Error::top_level("primitive")) } fn deserialize_map<V>(self, visitor: V) -> Result<V::Value> |