summaryrefslogtreecommitdiff
path: root/src/de
diff options
context:
space:
mode:
authorSam Scott <sam.scott89@gmail.com>2017-05-21 16:08:51 +0100
committerSam Scott <sam.scott89@gmail.com>2017-05-21 16:08:51 +0100
commit6429b975c6cbcf5d7e0c2b1d02026f8d46b5c50f (patch)
tree4c0fe278c27ad294e0ec363d75d1a4175816f031 /src/de
parent58de85c0f7ee67294cc1554be2c77af5eecd651a (diff)
Stop LevelDeserializer from coercing values too early.
When deserializing types such as TupleStructs, if the `Level` value is a map, let's call `visit_map` instead of coercing it to a sequence immediately.
Diffstat (limited to 'src/de')
-rw-r--r--src/de/mod.rs51
1 files changed, 43 insertions, 8 deletions
diff --git a/src/de/mod.rs b/src/de/mod.rs
index 03e4065..cf2768b 100644
--- a/src/de/mod.rs
+++ b/src/de/mod.rs
@@ -505,10 +505,9 @@ impl<'de> de::Deserializer<'de> for LevelDeserializer {
},
Level::Sequence(_) => {
self.deserialize_seq(visitor)
-
},
Level::Flat(x) => {
- visitor.visit_string(x)
+ ParsableStringDeserializer(x).deserialize_any(visitor)
},
Level::Invalid(e) => {
Err(de::Error::custom(e))
@@ -593,7 +592,20 @@ impl<'de> de::Deserializer<'de> for LevelDeserializer {
) -> Result<V::Value>
where V: de::Visitor<'de>
{
- self.deserialize_seq(visitor)
+ match self.0 {
+ Level::Nested(_) => {
+ self.deserialize_map(visitor)
+ },
+ Level::Sequence(_) => {
+ self.deserialize_seq(visitor)
+ },
+ Level::Flat(_) => {
+ self.deserialize_seq(visitor)
+ },
+ Level::Invalid(e) => {
+ Err(de::Error::custom(e))
+ }
+ }
}
fn deserialize_tuple<V>(
@@ -603,8 +615,20 @@ impl<'de> de::Deserializer<'de> for LevelDeserializer {
) -> Result<V::Value>
where V: de::Visitor<'de>
{
- self.deserialize_seq(visitor)
-
+ match self.0 {
+ Level::Nested(_) => {
+ self.deserialize_map(visitor)
+ },
+ Level::Sequence(_) => {
+ self.deserialize_seq(visitor)
+ },
+ Level::Flat(_) => {
+ self.deserialize_seq(visitor)
+ },
+ Level::Invalid(e) => {
+ Err(de::Error::custom(e))
+ }
+ }
}
fn deserialize_tuple_struct<V>(
self,
@@ -614,8 +638,20 @@ impl<'de> de::Deserializer<'de> for LevelDeserializer {
) -> Result<V::Value>
where V: de::Visitor<'de>
{
- self.deserialize_seq(visitor)
- }
+ match self.0 {
+ Level::Nested(_) => {
+ self.deserialize_map(visitor)
+ },
+ Level::Sequence(_) => {
+ self.deserialize_seq(visitor)
+ },
+ Level::Flat(_) => {
+ self.deserialize_seq(visitor)
+ },
+ Level::Invalid(e) => {
+ Err(de::Error::custom(e))
+ }
+ } }
fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
where V: de::Visitor<'de>
@@ -705,7 +741,6 @@ impl<'de> de::Deserializer<'de> for ParsableStringDeserializer {
self.0.into_deserializer().deserialize_any(visitor)
}
-
forward_to_deserialize_any! {
map
struct