summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSam Scott <sam.scott89@gmail.com>2017-03-20 20:16:33 +0000
committerSam Scott <sam.scott89@gmail.com>2017-03-20 20:18:16 +0000
commit81b77bd7e7f3397ddfeeb9a63f5c74a08fd6837c (patch)
treed17d56f8a210adabbb4d5468e1fff73d052b0de5 /src
parent579af8c2aa5cf4ab520945084a162c86a74447e9 (diff)
Add support for optional sequences and structs.
Diffstat (limited to 'src')
-rw-r--r--src/de.rs29
1 files changed, 18 insertions, 11 deletions
diff --git a/src/de.rs b/src/de.rs
index 0e08bf1..248096a 100644
--- a/src/de.rs
+++ b/src/de.rs
@@ -568,10 +568,19 @@ impl de::Deserializer for LevelDeserializer {
fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where V: de::Visitor,
{
- if let Level::Flat(x) = self.0 {
- x.into_deserializer().deserialize(visitor)
- } else {
- Err(de::Error::custom("cannot deserialize value"))
+ match self.0 {
+ Level::Nested(map) => {
+ Deserializer::with_map(map).deserialize_map(visitor)
+ },
+ Level::Sequence(seq) => {
+ SeqDeserializer::new(seq.into_iter()).deserialize(visitor)
+ },
+ Level::Flat(x) => {
+ x.into_deserializer().deserialize(visitor)
+ },
+ Level::Invalid(e) => {
+ Err(de::Error::custom(e))
+ }
}
}
@@ -631,14 +640,12 @@ impl de::Deserializer for LevelDeserializer {
where V: de::Visitor,
{
match self.0 {
- Level::Flat(x) => {
- if x == "" {
- visitor.visit_none()
- } else {
- visitor.visit_some(x.into_deserializer())
- }
+ Level::Flat(ref x) if x == "" => {
+ visitor.visit_none()
+ },
+ _ => {
+ visitor.visit_some(self)
},
- _ => Err(de::Error::custom("value does not appear to be a value")),
}
}