From fcd94f0a90582e1684d2b1a8f92bf52bffbeeccd Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sat, 28 Aug 2021 10:37:47 -0700 Subject: [PATCH 1/3] Delete Deserializer impl from value::de::SeqDeserializer --- src/value/de.rs | 49 ++++++++++++++++--------------------------------- 1 file changed, 16 insertions(+), 33 deletions(-) diff --git a/src/value/de.rs b/src/value/de.rs index da216831b..94fdecd9b 100644 --- a/src/value/de.rs +++ b/src/value/de.rs @@ -512,7 +512,22 @@ impl<'de> VariantAccess<'de> for VariantDeserializer { { match self.value { Some(Value::Array(v)) => { - serde::Deserializer::deserialize_any(SeqDeserializer::new(v), visitor) + let len = v.len(); + if len == 0 { + visitor.visit_unit() + } else { + let mut seq = SeqDeserializer::new(v); + let ret = tri!(visitor.visit_seq(&mut seq)); + let remaining = seq.iter.len(); + if remaining == 0 { + Ok(ret) + } else { + Err(serde::de::Error::invalid_length( + len, + &"fewer elements in array", + )) + } + } } Some(other) => Err(serde::de::Error::invalid_type( other.unexpected(), @@ -559,38 +574,6 @@ impl SeqDeserializer { } } -impl<'de> serde::Deserializer<'de> for SeqDeserializer { - type Error = Error; - - #[inline] - fn deserialize_any(mut self, visitor: V) -> Result - where - V: Visitor<'de>, - { - let len = self.iter.len(); - if len == 0 { - visitor.visit_unit() - } else { - let ret = tri!(visitor.visit_seq(&mut self)); - let remaining = self.iter.len(); - if remaining == 0 { - Ok(ret) - } else { - Err(serde::de::Error::invalid_length( - len, - &"fewer elements in array", - )) - } - } - } - - forward_to_deserialize_any! { - bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string - bytes byte_buf option unit unit_struct newtype_struct seq tuple - tuple_struct map struct enum identifier ignored_any - } -} - impl<'de> SeqAccess<'de> for SeqDeserializer { type Error = Error; From cb1e7301d62fca70e406cc2afdef14cf426d5011 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sat, 28 Aug 2021 10:39:55 -0700 Subject: [PATCH 2/3] Delete Deserializer impl from value::de::SeqRefDeserializer --- src/value/de.rs | 49 ++++++++++++++++--------------------------------- 1 file changed, 16 insertions(+), 33 deletions(-) diff --git a/src/value/de.rs b/src/value/de.rs index 94fdecd9b..675036645 100644 --- a/src/value/de.rs +++ b/src/value/de.rs @@ -1006,7 +1006,22 @@ impl<'de> VariantAccess<'de> for VariantRefDeserializer<'de> { { match self.value { Some(&Value::Array(ref v)) => { - serde::Deserializer::deserialize_any(SeqRefDeserializer::new(v), visitor) + let len = v.len(); + if len == 0 { + visitor.visit_unit() + } else { + let mut seq = SeqRefDeserializer::new(v); + let ret = tri!(visitor.visit_seq(&mut seq)); + let remaining = seq.iter.len(); + if remaining == 0 { + Ok(ret) + } else { + Err(serde::de::Error::invalid_length( + len, + &"fewer elements in array", + )) + } + } } Some(other) => Err(serde::de::Error::invalid_type( other.unexpected(), @@ -1053,38 +1068,6 @@ impl<'de> SeqRefDeserializer<'de> { } } -impl<'de> serde::Deserializer<'de> for SeqRefDeserializer<'de> { - type Error = Error; - - #[inline] - fn deserialize_any(mut self, visitor: V) -> Result - where - V: Visitor<'de>, - { - let len = self.iter.len(); - if len == 0 { - visitor.visit_unit() - } else { - let ret = tri!(visitor.visit_seq(&mut self)); - let remaining = self.iter.len(); - if remaining == 0 { - Ok(ret) - } else { - Err(serde::de::Error::invalid_length( - len, - &"fewer elements in array", - )) - } - } - } - - forward_to_deserialize_any! { - bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string - bytes byte_buf option unit unit_struct newtype_struct seq tuple - tuple_struct map struct enum identifier ignored_any - } -} - impl<'de> SeqAccess<'de> for SeqRefDeserializer<'de> { type Error = Error; From cdc2ad37819bbf7b4a34815b82e3d496155b115e Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sat, 28 Aug 2021 10:40:49 -0700 Subject: [PATCH 3/3] Delete Deserializer impl from value::de::MapRefDeserializer --- src/value/de.rs | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/src/value/de.rs b/src/value/de.rs index 675036645..f5f87bcbb 100644 --- a/src/value/de.rs +++ b/src/value/de.rs @@ -1043,9 +1043,7 @@ impl<'de> VariantAccess<'de> for VariantRefDeserializer<'de> { V: Visitor<'de>, { match self.value { - Some(&Value::Object(ref v)) => { - serde::Deserializer::deserialize_any(MapRefDeserializer::new(v), visitor) - } + Some(&Value::Object(ref v)) => visitor.visit_map(MapRefDeserializer::new(v)), Some(other) => Err(serde::de::Error::invalid_type( other.unexpected(), &"struct variant", @@ -1140,24 +1138,6 @@ impl<'de> MapAccess<'de> for MapRefDeserializer<'de> { } } -impl<'de> serde::Deserializer<'de> for MapRefDeserializer<'de> { - type Error = Error; - - #[inline] - fn deserialize_any(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - visitor.visit_map(self) - } - - forward_to_deserialize_any! { - bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string - bytes byte_buf option unit unit_struct newtype_struct seq tuple - tuple_struct map struct enum identifier ignored_any - } -} - struct MapKeyDeserializer<'de> { key: Cow<'de, str>, }