From b2377d4c0b012573f54772990bcb0a653e3a8688 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Wed, 5 Apr 2017 08:54:30 -0700 Subject: [PATCH] Allow enums in ignored map value in serde_test --- serde_test/src/de.rs | 64 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 59 insertions(+), 5 deletions(-) diff --git a/serde_test/src/de.rs b/serde_test/src/de.rs index 7a0918f6..5437ffa2 100644 --- a/serde_test/src/de.rs +++ b/serde_test/src/de.rs @@ -132,12 +132,35 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> { Some(Token::StructStart(_, len)) => { self.visit_map(Some(len), Token::StructSep, Token::StructEnd, visitor) } + Some(Token::EnumStart(_)) => { + let variant = self.next_token().ok_or(Error::EndOfTokens)?; + let next = *self.tokens.first().ok_or(Error::EndOfTokens)?; + match (variant, next) { + (Token::Str(variant), Token::Unit) => { + self.next_token(); + visitor.visit_str(variant) + } + (Token::Bytes(variant), Token::Unit) => { + self.next_token(); + visitor.visit_bytes(variant) + } + (Token::U32(variant), Token::Unit) => { + self.next_token(); + visitor.visit_u32(variant) + } + (variant, Token::Unit) => { + Err(Error::UnexpectedToken(variant)) + } + (variant, _) => { + visitor.visit_map(EnumMapVisitor::new(self, variant)) + } + } + } Some(Token::EnumUnit(_, variant)) => visitor.visit_str(variant), - Some(Token::EnumStart(variant)) | Some(Token::EnumNewType(_, variant)) | Some(Token::EnumSeqStart(_, variant, _)) | Some(Token::EnumMapStart(_, variant, _)) => { - visitor.visit_map(EnumMapVisitor::new(self, variant)) + visitor.visit_map(EnumMapVisitor::new(self, Token::Str(variant))) } Some(token) => Err(Error::UnexpectedToken(token)), None => Err(Error::EndOfTokens), @@ -542,11 +565,11 @@ impl<'de, 'a> VariantVisitor<'de> for DeserializerEnumVisitor<'a, 'de> { struct EnumMapVisitor<'a, 'de: 'a> { de: &'a mut Deserializer<'de>, - variant: Option<&'a str>, + variant: Option, } impl<'a, 'de> EnumMapVisitor<'a, 'de> { - fn new(de: &'a mut Deserializer<'de>, variant: &'a str) -> Self { + fn new(de: &'a mut Deserializer<'de>, variant: Token) -> Self { EnumMapVisitor { de: de, variant: Some(variant), @@ -561,7 +584,18 @@ impl<'de, 'a> MapVisitor<'de> for EnumMapVisitor<'a, 'de> { where K: DeserializeSeed<'de> { match self.variant.take() { - Some(variant) => seed.deserialize(variant.into_deserializer()).map(Some), + Some(Token::Str(variant)) => { + seed.deserialize(variant.into_deserializer()).map(Some) + } + Some(Token::Bytes(variant)) => { + seed.deserialize(BytesDeserializer { value: variant }).map(Some) + } + Some(Token::U32(variant)) => { + seed.deserialize(variant.into_deserializer()).map(Some) + } + Some(other) => { + Err(Error::UnexpectedToken(other)) + } None => Ok(None), } } @@ -600,3 +634,23 @@ impl<'de, 'a> MapVisitor<'de> for EnumMapVisitor<'a, 'de> { } } } + +struct BytesDeserializer { + value: &'static [u8], +} + +impl<'de> de::Deserializer<'de> for BytesDeserializer { + type Error = Error; + + fn deserialize(self, visitor: V) -> Result + where V: de::Visitor<'de> + { + visitor.visit_bytes(self.value) + } + + forward_to_deserialize! { + bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option + seq seq_fixed_size bytes map unit_struct newtype_struct tuple_struct + struct struct_field tuple enum ignored_any byte_buf + } +}