diff options
author | Sam Scott <sam.scott89@gmail.com> | 2017-05-21 16:08:51 +0100 |
---|---|---|
committer | Sam Scott <sam.scott89@gmail.com> | 2017-05-21 16:08:51 +0100 |
commit | 6429b975c6cbcf5d7e0c2b1d02026f8d46b5c50f (patch) | |
tree | 4c0fe278c27ad294e0ec363d75d1a4175816f031 /src/de | |
parent | 58de85c0f7ee67294cc1554be2c77af5eecd651a (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.rs | 51 |
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 |