summaryrefslogtreecommitdiff
path: root/src/de/mod.rs
diff options
context:
space:
mode:
authorSimon Bihel <simon.bihel@spruceid.com>2023-06-12 16:53:06 +0100
committerSimon Bihel <simon.bihel@spruceid.com>2023-06-12 16:54:50 +0100
commit058781081b811b65bf14bf2b673de22d0761fbad (patch)
treedc8932b6e2ca0402ddc343aacee41f58cacb2faf /src/de/mod.rs
parent8a13b677f1b99ab78870f8731e75a7642f2d0530 (diff)
Add support for enums in top level
Partially address #71
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 ef9cd76..150f6fa 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.
@@ -190,7 +191,7 @@ pub fn from_str<'de, T: de::Deserialize<'de>>(input: &'de str) -> Result<T> {
///
/// Supported top-level outputs are structs and maps.
pub(crate) struct QsDeserializer<'a> {
- iter: IntoIter<Cow<'a, str>, Level<'a>>,
+ iter: Peekable<IntoIter<Cow<'a, str>, Level<'a>>>,
value: Option<Level<'a>>,
}
@@ -207,7 +208,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,
}
}
@@ -225,11 +226,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>