From 6429b975c6cbcf5d7e0c2b1d02026f8d46b5c50f Mon Sep 17 00:00:00 2001 From: Sam Scott Date: Sun, 21 May 2017 16:08:51 +0100 Subject: 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. --- src/de/mod.rs | 51 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 8 deletions(-) (limited to 'src') 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 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( @@ -603,8 +615,20 @@ impl<'de> de::Deserializer<'de> for LevelDeserializer { ) -> Result 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( self, @@ -614,8 +638,20 @@ impl<'de> de::Deserializer<'de> for LevelDeserializer { ) -> Result 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(self, visitor: V) -> Result 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 -- cgit v1.2.3