Improve "expecting" message of adjacently tagged enum variant

This commit is contained in:
David Tolnay 2023-08-01 22:43:26 -07:00
parent 9bd52ec5c1
commit ef4f860384
No known key found for this signature in database
GPG Key ID: F9BA143B95FF6D82
6 changed files with 36 additions and 35 deletions

View File

@ -2841,13 +2841,13 @@ fn flat_map_take_entry<'de>(
} }
pub struct AdjacentlyTaggedEnumVariantSeed<F> { pub struct AdjacentlyTaggedEnumVariantSeed<F> {
pub tag: &'static str, pub enum_name: &'static str,
pub variants: &'static [&'static str], pub variants: &'static [&'static str],
pub fields_enum: PhantomData<F>, pub fields_enum: PhantomData<F>,
} }
pub struct AdjacentlyTaggedEnumVariantVisitor<F> { pub struct AdjacentlyTaggedEnumVariantVisitor<F> {
tag: &'static str, enum_name: &'static str,
fields_enum: PhantomData<F>, fields_enum: PhantomData<F>,
} }
@ -2858,7 +2858,7 @@ where
type Value = F; type Value = F;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 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<A>(self, data: A) -> Result<Self::Value, A::Error> fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>
@ -2882,10 +2882,10 @@ where
D: Deserializer<'de>, D: Deserializer<'de>,
{ {
deserializer.deserialize_enum( deserializer.deserialize_enum(
self.tag, self.enum_name,
self.variants, self.variants,
AdjacentlyTaggedEnumVariantVisitor { AdjacentlyTaggedEnumVariantVisitor {
tag: self.tag, enum_name: self.enum_name,
fields_enum: PhantomData, fields_enum: PhantomData,
}, },
) )

View File

@ -1357,7 +1357,7 @@ where
} }
pub struct AdjacentlyTaggedEnumVariant { pub struct AdjacentlyTaggedEnumVariant {
pub tag: &'static str, pub enum_name: &'static str,
pub variant_index: u32, pub variant_index: u32,
pub variant_name: &'static str, pub variant_name: &'static str,
} }
@ -1367,6 +1367,6 @@ impl Serialize for AdjacentlyTaggedEnumVariant {
where where
S: Serializer, 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)
} }
} }

View File

@ -1460,7 +1460,8 @@ fn deserialize_adjacently_tagged_enum(
}) })
.collect(); .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 expecting = cattrs.expecting().unwrap_or(&expecting);
let type_name = cattrs.name().deserialize_name(); let type_name = cattrs.name().deserialize_name();
let deny_unknown_fields = cattrs.deny_unknown_fields(); let deny_unknown_fields = cattrs.deny_unknown_fields();
@ -1482,7 +1483,7 @@ fn deserialize_adjacently_tagged_enum(
let variant_seed = quote! { let variant_seed = quote! {
_serde::__private::de::AdjacentlyTaggedEnumVariantSeed::<__Field> { _serde::__private::de::AdjacentlyTaggedEnumVariantSeed::<__Field> {
tag: #tag, enum_name: #rust_name,
variants: &VARIANTS, variants: &VARIANTS,
fields_enum: _serde::__private::PhantomData fields_enum: _serde::__private::PhantomData
} }

View File

@ -650,7 +650,7 @@ fn serialize_adjacently_tagged_variant(
let variant_name = variant.attrs.name().serialize_name(); let variant_name = variant.attrs.name().serialize_name();
let serialize_variant = quote! { let serialize_variant = quote! {
&_serde::__private::ser::AdjacentlyTaggedEnumVariant { &_serde::__private::ser::AdjacentlyTaggedEnumVariant {
tag: #tag, enum_name: #type_name,
variant_index: #variant_index, variant_index: #variant_index,
variant_name: #variant_name, variant_name: #variant_name,
} }

View File

@ -2109,7 +2109,7 @@ fn test_adjacently_tagged_enum_bytes() {
}, },
Token::Str("t"), Token::Str("t"),
Token::UnitVariant { Token::UnitVariant {
name: "t", name: "Data",
variant: "A", variant: "A",
}, },
Token::Str("c"), Token::Str("c"),
@ -2130,7 +2130,7 @@ fn test_adjacently_tagged_enum_bytes() {
}, },
Token::Bytes(b"t"), Token::Bytes(b"t"),
Token::UnitVariant { Token::UnitVariant {
name: "t", name: "Data",
variant: "A", variant: "A",
}, },
Token::Bytes(b"c"), Token::Bytes(b"c"),
@ -2174,7 +2174,7 @@ fn test_adjacently_tagged_enum_containing_flatten() {
}, },
Token::Str("t"), Token::Str("t"),
Token::UnitVariant { Token::UnitVariant {
name: "t", name: "Data",
variant: "A", variant: "A",
}, },
Token::Str("c"), 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 // Check that #[serde(expecting = "...")] doesn't affect variant identifier error message
assert_de_tokens_error::<Enum>( assert_de_tokens_error::<Enum>(
&[Token::Map { len: None }, Token::Str("tag"), Token::Unit], &[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::U32(42),
Token::Str("tag"), Token::Str("tag"),
Token::UnitVariant { Token::UnitVariant {
name: "tag", name: "Enum",
variant: "Struct", variant: "Struct",
}, },
Token::Str("content"), Token::Str("content"),
@ -3033,7 +3033,7 @@ mod flatten {
Token::U32(42), Token::U32(42),
Token::Str("tag"), Token::Str("tag"),
Token::UnitVariant { Token::UnitVariant {
name: "tag", name: "Enum",
variant: "Newtype", variant: "Newtype",
}, },
Token::Str("content"), Token::Str("content"),

View File

@ -473,7 +473,7 @@ fn test_adjacently_tagged_newtype_struct() {
Token::U32(5), Token::U32(5),
Token::Str("t"), Token::Str("t"),
Token::UnitVariant { Token::UnitVariant {
name: "t", name: "E",
variant: "Newtype", variant: "Newtype",
}, },
Token::StructEnd, Token::StructEnd,
@ -1070,7 +1070,7 @@ fn test_adjacently_tagged_enum() {
}, },
Token::Str("t"), Token::Str("t"),
Token::UnitVariant { Token::UnitVariant {
name: "t", name: "AdjacentlyTagged",
variant: "Unit", variant: "Unit",
}, },
Token::StructEnd, Token::StructEnd,
@ -1087,7 +1087,7 @@ fn test_adjacently_tagged_enum() {
}, },
Token::Str("t"), Token::Str("t"),
Token::UnitVariant { Token::UnitVariant {
name: "t", name: "AdjacentlyTagged",
variant: "Unit", variant: "Unit",
}, },
Token::StructEnd, Token::StructEnd,
@ -1104,7 +1104,7 @@ fn test_adjacently_tagged_enum() {
}, },
Token::Str("t"), Token::Str("t"),
Token::UnitVariant { Token::UnitVariant {
name: "t", name: "AdjacentlyTagged",
variant: "Unit", variant: "Unit",
}, },
Token::Str("c"), Token::Str("c"),
@ -1125,7 +1125,7 @@ fn test_adjacently_tagged_enum() {
Token::Unit, Token::Unit,
Token::Str("t"), Token::Str("t"),
Token::UnitVariant { Token::UnitVariant {
name: "t", name: "AdjacentlyTagged",
variant: "Unit", variant: "Unit",
}, },
Token::StructEnd, Token::StructEnd,
@ -1144,7 +1144,7 @@ fn test_adjacently_tagged_enum() {
Token::Unit, Token::Unit,
Token::Str("t"), Token::Str("t"),
Token::UnitVariant { Token::UnitVariant {
name: "t", name: "AdjacentlyTagged",
variant: "Unit", variant: "Unit",
}, },
Token::Str("g"), Token::Str("g"),
@ -1167,7 +1167,7 @@ fn test_adjacently_tagged_enum() {
}, },
Token::Str("t"), Token::Str("t"),
Token::UnitVariant { Token::UnitVariant {
name: "t", name: "AdjacentlyTagged",
variant: "Newtype", variant: "Newtype",
}, },
Token::Str("c"), Token::Str("c"),
@ -1188,7 +1188,7 @@ fn test_adjacently_tagged_enum() {
Token::U8(1), Token::U8(1),
Token::Str("t"), Token::Str("t"),
Token::UnitVariant { Token::UnitVariant {
name: "t", name: "AdjacentlyTagged",
variant: "Newtype", variant: "Newtype",
}, },
Token::StructEnd, Token::StructEnd,
@ -1205,7 +1205,7 @@ fn test_adjacently_tagged_enum() {
}, },
Token::Str("t"), Token::Str("t"),
Token::UnitVariant { Token::UnitVariant {
name: "t", name: "AdjacentlyTagged",
variant: "Newtype", variant: "Newtype",
}, },
Token::StructEnd, Token::StructEnd,
@ -1222,7 +1222,7 @@ fn test_adjacently_tagged_enum() {
}, },
Token::Str("t"), Token::Str("t"),
Token::UnitVariant { Token::UnitVariant {
name: "t", name: "AdjacentlyTagged",
variant: "Tuple", variant: "Tuple",
}, },
Token::Str("c"), Token::Str("c"),
@ -1249,7 +1249,7 @@ fn test_adjacently_tagged_enum() {
Token::TupleEnd, Token::TupleEnd,
Token::Str("t"), Token::Str("t"),
Token::UnitVariant { Token::UnitVariant {
name: "t", name: "AdjacentlyTagged",
variant: "Tuple", variant: "Tuple",
}, },
Token::StructEnd, Token::StructEnd,
@ -1266,7 +1266,7 @@ fn test_adjacently_tagged_enum() {
}, },
Token::Str("t"), Token::Str("t"),
Token::UnitVariant { Token::UnitVariant {
name: "t", name: "AdjacentlyTagged",
variant: "Struct", variant: "Struct",
}, },
Token::Str("c"), Token::Str("c"),
@ -1299,7 +1299,7 @@ fn test_adjacently_tagged_enum() {
Token::StructEnd, Token::StructEnd,
Token::Str("t"), Token::Str("t"),
Token::UnitVariant { Token::UnitVariant {
name: "t", name: "AdjacentlyTagged",
variant: "Struct", variant: "Struct",
}, },
Token::StructEnd, Token::StructEnd,
@ -1318,7 +1318,7 @@ fn test_adjacently_tagged_enum() {
Token::U8(1), Token::U8(1),
Token::U64(0), // tag field Token::U64(0), // tag field
Token::UnitVariant { Token::UnitVariant {
name: "t", name: "AdjacentlyTagged",
variant: "Newtype", variant: "Newtype",
}, },
Token::StructEnd, Token::StructEnd,
@ -1337,7 +1337,7 @@ fn test_adjacently_tagged_enum() {
Token::U8(1), Token::U8(1),
Token::Bytes(b"t"), Token::Bytes(b"t"),
Token::UnitVariant { Token::UnitVariant {
name: "t", name: "AdjacentlyTagged",
variant: "Newtype", variant: "Newtype",
}, },
Token::StructEnd, Token::StructEnd,
@ -1362,7 +1362,7 @@ fn test_adjacently_tagged_enum_deny_unknown_fields() {
}, },
Token::Str("t"), Token::Str("t"),
Token::UnitVariant { Token::UnitVariant {
name: "t", name: "AdjacentlyTagged",
variant: "Unit", variant: "Unit",
}, },
Token::Str("c"), Token::Str("c"),
@ -1379,7 +1379,7 @@ fn test_adjacently_tagged_enum_deny_unknown_fields() {
}, },
Token::Str("t"), Token::Str("t"),
Token::UnitVariant { Token::UnitVariant {
name: "t", name: "AdjacentlyTagged",
variant: "Unit", variant: "Unit",
}, },
Token::Str("c"), Token::Str("c"),
@ -1421,7 +1421,7 @@ fn test_adjacently_tagged_enum_deny_unknown_fields() {
}, },
Token::U64(0), // tag field Token::U64(0), // tag field
Token::UnitVariant { Token::UnitVariant {
name: "t", name: "AdjacentlyTagged",
variant: "Unit", variant: "Unit",
}, },
Token::U64(3), Token::U64(3),
@ -1620,7 +1620,7 @@ fn test_internally_tagged_struct_with_flattened_field() {
Token::Str("Struct"), Token::Str("Struct"),
Token::Str("tag_enum"), Token::Str("tag_enum"),
Token::UnitVariant { Token::UnitVariant {
name: "tag_enum", name: "Enum",
variant: "A", variant: "A",
}, },
Token::Str("content"), Token::Str("content"),