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 tag: &'static str,
pub enum_name: &'static str,
pub variants: &'static [&'static str],
pub fields_enum: PhantomData<F>,
}
pub struct AdjacentlyTaggedEnumVariantVisitor<F> {
tag: &'static str,
enum_name: &'static str,
fields_enum: PhantomData<F>,
}
@ -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<A>(self, data: A) -> Result<Self::Value, A::Error>
@ -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,
},
)

View File

@ -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)
}
}

View File

@ -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
}

View File

@ -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,
}

View File

@ -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::<Enum>(
&[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"),

View File

@ -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"),