From ef4f860384e4b749f49431ee1aacbb4fe2c057d8 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Tue, 1 Aug 2023 22:43:26 -0700 Subject: [PATCH] Improve "expecting" message of adjacently tagged enum variant --- serde/src/private/de.rs | 10 ++++---- serde/src/private/ser.rs | 4 +-- serde_derive/src/de.rs | 5 ++-- serde_derive/src/ser.rs | 2 +- test_suite/tests/test_annotations.rs | 12 ++++----- test_suite/tests/test_macros.rs | 38 ++++++++++++++-------------- 6 files changed, 36 insertions(+), 35 deletions(-) diff --git a/serde/src/private/de.rs b/serde/src/private/de.rs index be58bb22..571638b6 100644 --- a/serde/src/private/de.rs +++ b/serde/src/private/de.rs @@ -2841,13 +2841,13 @@ fn flat_map_take_entry<'de>( } pub struct AdjacentlyTaggedEnumVariantSeed { - pub tag: &'static str, + pub enum_name: &'static str, pub variants: &'static [&'static str], pub fields_enum: PhantomData, } pub struct AdjacentlyTaggedEnumVariantVisitor { - tag: &'static str, + enum_name: &'static str, fields_enum: PhantomData, } @@ -2858,7 +2858,7 @@ where type Value = F; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - write!(formatter, "enum {}", self.tag) + write!(formatter, "variant of enum {}", self.enum_name) } fn visit_enum(self, data: A) -> Result @@ -2882,10 +2882,10 @@ where D: Deserializer<'de>, { deserializer.deserialize_enum( - self.tag, + self.enum_name, self.variants, AdjacentlyTaggedEnumVariantVisitor { - tag: self.tag, + enum_name: self.enum_name, fields_enum: PhantomData, }, ) diff --git a/serde/src/private/ser.rs b/serde/src/private/ser.rs index 7a801c9d..7876542e 100644 --- a/serde/src/private/ser.rs +++ b/serde/src/private/ser.rs @@ -1357,7 +1357,7 @@ where } pub struct AdjacentlyTaggedEnumVariant { - pub tag: &'static str, + pub enum_name: &'static str, pub variant_index: u32, pub variant_name: &'static str, } @@ -1367,6 +1367,6 @@ impl Serialize for AdjacentlyTaggedEnumVariant { where S: Serializer, { - serializer.serialize_unit_variant(self.tag, self.variant_index, self.variant_name) + serializer.serialize_unit_variant(self.enum_name, self.variant_index, self.variant_name) } } diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index 77f3aec5..3db7b563 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -1460,7 +1460,8 @@ fn deserialize_adjacently_tagged_enum( }) .collect(); - let expecting = format!("adjacently tagged enum {}", params.type_name()); + let rust_name = params.type_name(); + let expecting = format!("adjacently tagged enum {}", rust_name); let expecting = cattrs.expecting().unwrap_or(&expecting); let type_name = cattrs.name().deserialize_name(); let deny_unknown_fields = cattrs.deny_unknown_fields(); @@ -1482,7 +1483,7 @@ fn deserialize_adjacently_tagged_enum( let variant_seed = quote! { _serde::__private::de::AdjacentlyTaggedEnumVariantSeed::<__Field> { - tag: #tag, + enum_name: #rust_name, variants: &VARIANTS, fields_enum: _serde::__private::PhantomData } diff --git a/serde_derive/src/ser.rs b/serde_derive/src/ser.rs index 8a0f58dd..d6aba771 100644 --- a/serde_derive/src/ser.rs +++ b/serde_derive/src/ser.rs @@ -650,7 +650,7 @@ fn serialize_adjacently_tagged_variant( let variant_name = variant.attrs.name().serialize_name(); let serialize_variant = quote! { &_serde::__private::ser::AdjacentlyTaggedEnumVariant { - tag: #tag, + enum_name: #type_name, variant_index: #variant_index, variant_name: #variant_name, } diff --git a/test_suite/tests/test_annotations.rs b/test_suite/tests/test_annotations.rs index 10f1d05e..72367f85 100644 --- a/test_suite/tests/test_annotations.rs +++ b/test_suite/tests/test_annotations.rs @@ -2109,7 +2109,7 @@ fn test_adjacently_tagged_enum_bytes() { }, Token::Str("t"), Token::UnitVariant { - name: "t", + name: "Data", variant: "A", }, Token::Str("c"), @@ -2130,7 +2130,7 @@ fn test_adjacently_tagged_enum_bytes() { }, Token::Bytes(b"t"), Token::UnitVariant { - name: "t", + name: "Data", variant: "A", }, Token::Bytes(b"c"), @@ -2174,7 +2174,7 @@ fn test_adjacently_tagged_enum_containing_flatten() { }, Token::Str("t"), Token::UnitVariant { - name: "t", + name: "Data", variant: "A", }, Token::Str("c"), @@ -2766,7 +2766,7 @@ fn test_expecting_message_adjacently_tagged_enum() { // Check that #[serde(expecting = "...")] doesn't affect variant identifier error message assert_de_tokens_error::( &[Token::Map { len: None }, Token::Str("tag"), Token::Unit], - r#"invalid type: unit value, expected enum tag"#, + r#"invalid type: unit value, expected variant of enum Enum"#, ); } @@ -3002,7 +3002,7 @@ mod flatten { Token::U32(42), Token::Str("tag"), Token::UnitVariant { - name: "tag", + name: "Enum", variant: "Struct", }, Token::Str("content"), @@ -3033,7 +3033,7 @@ mod flatten { Token::U32(42), Token::Str("tag"), Token::UnitVariant { - name: "tag", + name: "Enum", variant: "Newtype", }, Token::Str("content"), diff --git a/test_suite/tests/test_macros.rs b/test_suite/tests/test_macros.rs index cbd0d9b7..2b7d189f 100644 --- a/test_suite/tests/test_macros.rs +++ b/test_suite/tests/test_macros.rs @@ -473,7 +473,7 @@ fn test_adjacently_tagged_newtype_struct() { Token::U32(5), Token::Str("t"), Token::UnitVariant { - name: "t", + name: "E", variant: "Newtype", }, Token::StructEnd, @@ -1070,7 +1070,7 @@ fn test_adjacently_tagged_enum() { }, Token::Str("t"), Token::UnitVariant { - name: "t", + name: "AdjacentlyTagged", variant: "Unit", }, Token::StructEnd, @@ -1087,7 +1087,7 @@ fn test_adjacently_tagged_enum() { }, Token::Str("t"), Token::UnitVariant { - name: "t", + name: "AdjacentlyTagged", variant: "Unit", }, Token::StructEnd, @@ -1104,7 +1104,7 @@ fn test_adjacently_tagged_enum() { }, Token::Str("t"), Token::UnitVariant { - name: "t", + name: "AdjacentlyTagged", variant: "Unit", }, Token::Str("c"), @@ -1125,7 +1125,7 @@ fn test_adjacently_tagged_enum() { Token::Unit, Token::Str("t"), Token::UnitVariant { - name: "t", + name: "AdjacentlyTagged", variant: "Unit", }, Token::StructEnd, @@ -1144,7 +1144,7 @@ fn test_adjacently_tagged_enum() { Token::Unit, Token::Str("t"), Token::UnitVariant { - name: "t", + name: "AdjacentlyTagged", variant: "Unit", }, Token::Str("g"), @@ -1167,7 +1167,7 @@ fn test_adjacently_tagged_enum() { }, Token::Str("t"), Token::UnitVariant { - name: "t", + name: "AdjacentlyTagged", variant: "Newtype", }, Token::Str("c"), @@ -1188,7 +1188,7 @@ fn test_adjacently_tagged_enum() { Token::U8(1), Token::Str("t"), Token::UnitVariant { - name: "t", + name: "AdjacentlyTagged", variant: "Newtype", }, Token::StructEnd, @@ -1205,7 +1205,7 @@ fn test_adjacently_tagged_enum() { }, Token::Str("t"), Token::UnitVariant { - name: "t", + name: "AdjacentlyTagged", variant: "Newtype", }, Token::StructEnd, @@ -1222,7 +1222,7 @@ fn test_adjacently_tagged_enum() { }, Token::Str("t"), Token::UnitVariant { - name: "t", + name: "AdjacentlyTagged", variant: "Tuple", }, Token::Str("c"), @@ -1249,7 +1249,7 @@ fn test_adjacently_tagged_enum() { Token::TupleEnd, Token::Str("t"), Token::UnitVariant { - name: "t", + name: "AdjacentlyTagged", variant: "Tuple", }, Token::StructEnd, @@ -1266,7 +1266,7 @@ fn test_adjacently_tagged_enum() { }, Token::Str("t"), Token::UnitVariant { - name: "t", + name: "AdjacentlyTagged", variant: "Struct", }, Token::Str("c"), @@ -1299,7 +1299,7 @@ fn test_adjacently_tagged_enum() { Token::StructEnd, Token::Str("t"), Token::UnitVariant { - name: "t", + name: "AdjacentlyTagged", variant: "Struct", }, Token::StructEnd, @@ -1318,7 +1318,7 @@ fn test_adjacently_tagged_enum() { Token::U8(1), Token::U64(0), // tag field Token::UnitVariant { - name: "t", + name: "AdjacentlyTagged", variant: "Newtype", }, Token::StructEnd, @@ -1337,7 +1337,7 @@ fn test_adjacently_tagged_enum() { Token::U8(1), Token::Bytes(b"t"), Token::UnitVariant { - name: "t", + name: "AdjacentlyTagged", variant: "Newtype", }, Token::StructEnd, @@ -1362,7 +1362,7 @@ fn test_adjacently_tagged_enum_deny_unknown_fields() { }, Token::Str("t"), Token::UnitVariant { - name: "t", + name: "AdjacentlyTagged", variant: "Unit", }, Token::Str("c"), @@ -1379,7 +1379,7 @@ fn test_adjacently_tagged_enum_deny_unknown_fields() { }, Token::Str("t"), Token::UnitVariant { - name: "t", + name: "AdjacentlyTagged", variant: "Unit", }, Token::Str("c"), @@ -1421,7 +1421,7 @@ fn test_adjacently_tagged_enum_deny_unknown_fields() { }, Token::U64(0), // tag field Token::UnitVariant { - name: "t", + name: "AdjacentlyTagged", variant: "Unit", }, Token::U64(3), @@ -1620,7 +1620,7 @@ fn test_internally_tagged_struct_with_flattened_field() { Token::Str("Struct"), Token::Str("tag_enum"), Token::UnitVariant { - name: "tag_enum", + name: "Enum", variant: "A", }, Token::Str("content"),