Skip to content

Commit

Permalink
Improve "expecting" message of adjacently tagged enum variant
Browse files Browse the repository at this point in the history
  • Loading branch information
dtolnay committed Aug 2, 2023
1 parent 9bd52ec commit ef4f860
Show file tree
Hide file tree
Showing 6 changed files with 36 additions and 35 deletions.
10 changes: 5 additions & 5 deletions serde/src/private/de.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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>,
}

Expand All @@ -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>
Expand All @@ -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,
},
)
Expand Down
4 changes: 2 additions & 2 deletions serde/src/private/ser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}
Expand All @@ -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)
}
}
5 changes: 3 additions & 2 deletions serde_derive/src/de.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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
}
Expand Down
2 changes: 1 addition & 1 deletion serde_derive/src/ser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}
Expand Down
12 changes: 6 additions & 6 deletions test_suite/tests/test_annotations.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2109,7 +2109,7 @@ fn test_adjacently_tagged_enum_bytes() {
},
Token::Str("t"),
Token::UnitVariant {
name: "t",
name: "Data",
variant: "A",
},
Token::Str("c"),
Expand All @@ -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"),
Expand Down Expand Up @@ -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"),
Expand Down Expand Up @@ -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"#,
);
}

Expand Down Expand Up @@ -3002,7 +3002,7 @@ mod flatten {
Token::U32(42),
Token::Str("tag"),
Token::UnitVariant {
name: "tag",
name: "Enum",
variant: "Struct",
},
Token::Str("content"),
Expand Down Expand Up @@ -3033,7 +3033,7 @@ mod flatten {
Token::U32(42),
Token::Str("tag"),
Token::UnitVariant {
name: "tag",
name: "Enum",
variant: "Newtype",
},
Token::Str("content"),
Expand Down
38 changes: 19 additions & 19 deletions test_suite/tests/test_macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -1070,7 +1070,7 @@ fn test_adjacently_tagged_enum() {
},
Token::Str("t"),
Token::UnitVariant {
name: "t",
name: "AdjacentlyTagged",
variant: "Unit",
},
Token::StructEnd,
Expand All @@ -1087,7 +1087,7 @@ fn test_adjacently_tagged_enum() {
},
Token::Str("t"),
Token::UnitVariant {
name: "t",
name: "AdjacentlyTagged",
variant: "Unit",
},
Token::StructEnd,
Expand All @@ -1104,7 +1104,7 @@ fn test_adjacently_tagged_enum() {
},
Token::Str("t"),
Token::UnitVariant {
name: "t",
name: "AdjacentlyTagged",
variant: "Unit",
},
Token::Str("c"),
Expand All @@ -1125,7 +1125,7 @@ fn test_adjacently_tagged_enum() {
Token::Unit,
Token::Str("t"),
Token::UnitVariant {
name: "t",
name: "AdjacentlyTagged",
variant: "Unit",
},
Token::StructEnd,
Expand All @@ -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"),
Expand All @@ -1167,7 +1167,7 @@ fn test_adjacently_tagged_enum() {
},
Token::Str("t"),
Token::UnitVariant {
name: "t",
name: "AdjacentlyTagged",
variant: "Newtype",
},
Token::Str("c"),
Expand All @@ -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,
Expand All @@ -1205,7 +1205,7 @@ fn test_adjacently_tagged_enum() {
},
Token::Str("t"),
Token::UnitVariant {
name: "t",
name: "AdjacentlyTagged",
variant: "Newtype",
},
Token::StructEnd,
Expand All @@ -1222,7 +1222,7 @@ fn test_adjacently_tagged_enum() {
},
Token::Str("t"),
Token::UnitVariant {
name: "t",
name: "AdjacentlyTagged",
variant: "Tuple",
},
Token::Str("c"),
Expand All @@ -1249,7 +1249,7 @@ fn test_adjacently_tagged_enum() {
Token::TupleEnd,
Token::Str("t"),
Token::UnitVariant {
name: "t",
name: "AdjacentlyTagged",
variant: "Tuple",
},
Token::StructEnd,
Expand All @@ -1266,7 +1266,7 @@ fn test_adjacently_tagged_enum() {
},
Token::Str("t"),
Token::UnitVariant {
name: "t",
name: "AdjacentlyTagged",
variant: "Struct",
},
Token::Str("c"),
Expand Down Expand Up @@ -1299,7 +1299,7 @@ fn test_adjacently_tagged_enum() {
Token::StructEnd,
Token::Str("t"),
Token::UnitVariant {
name: "t",
name: "AdjacentlyTagged",
variant: "Struct",
},
Token::StructEnd,
Expand All @@ -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,
Expand All @@ -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,
Expand All @@ -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"),
Expand All @@ -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"),
Expand Down Expand Up @@ -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),
Expand Down Expand Up @@ -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"),
Expand Down

0 comments on commit ef4f860

Please sign in to comment.