summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/de/mod.rs13
-rw-r--r--src/de/parse.rs4
2 files changed, 9 insertions, 8 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>
diff --git a/src/de/parse.rs b/src/de/parse.rs
index 4f96fb9..3be7aa2 100644
--- a/src/de/parse.rs
+++ b/src/de/parse.rs
@@ -280,8 +280,8 @@ impl<'a> Parser<'a> {
// Parses all top level nodes into the `root` map.
while self.parse(&mut root)? {}
let iter = match root {
- Level::Nested(map) => map.into_iter(),
- _ => BTreeMap::default().into_iter(),
+ Level::Nested(map) => map.into_iter().peekable(),
+ _ => BTreeMap::default().into_iter().peekable(),
};
Ok(QsDeserializer { iter, value: None })
}