summaryrefslogtreecommitdiff
path: root/src/de/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/mod.rs')
-rw-r--r--src/de/mod.rs13
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>