summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJesse Morgan <jesse@jesterpm.net>2025-03-04 19:47:12 -0800
committerJesse Morgan <jesse@jesterpm.net>2025-03-04 19:47:12 -0800
commitb6cae020adf784dc241316a8b8f855ecf4416160 (patch)
tree3620226136b220542ffab11daf66da8b17fab123 /src
parente51f658461d8ab9c7caa64e93f5cf706183ce109 (diff)
parent058781081b811b65bf14bf2b673de22d0761fbad (diff)
Merge remote-tracking branch 'sbihel/main'HEADpatchedmaster
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 })
}