mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-06-12 13:11:02 +00:00
Fix case of skipped variant followed by other variants
This commit is contained in:
+18
-16
@@ -499,25 +499,27 @@ fn deserialize_item_enum(
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Match arms to extract a variant from a string
|
// Match arms to extract a variant from a string
|
||||||
let mut variant_arms = vec![];
|
let variant_arms = variants.iter()
|
||||||
for (i, variant) in variants.iter().filter(|variant| !variant.attrs.skip_deserializing()).enumerate() {
|
.enumerate()
|
||||||
let variant_name = field_i(i);
|
.filter(|&(_, variant)| !variant.attrs.skip_deserializing())
|
||||||
|
.map(|(i, variant)| {
|
||||||
|
let variant_name = field_i(i);
|
||||||
|
|
||||||
let block = deserialize_variant(
|
let block = deserialize_variant(
|
||||||
type_ident,
|
type_ident,
|
||||||
impl_generics,
|
impl_generics,
|
||||||
ty.clone(),
|
ty.clone(),
|
||||||
variant,
|
variant,
|
||||||
item_attrs,
|
item_attrs,
|
||||||
);
|
);
|
||||||
|
|
||||||
let arm = quote! {
|
quote! {
|
||||||
__Field::#variant_name => #block
|
__Field::#variant_name => #block
|
||||||
};
|
}
|
||||||
variant_arms.push(arm);
|
});
|
||||||
}
|
|
||||||
|
|
||||||
let match_variant = if variant_arms.is_empty() {
|
let all_skipped = variants.iter().all(|variant| variant.attrs.skip_deserializing());
|
||||||
|
let match_variant = if all_skipped {
|
||||||
// This is an empty enum like `enum Impossible {}` or an enum in which
|
// This is an empty enum like `enum Impossible {}` or an enum in which
|
||||||
// all variants have `#[serde(skip_deserializing)]`.
|
// all variants have `#[serde(skip_deserializing)]`.
|
||||||
quote! {
|
quote! {
|
||||||
|
|||||||
@@ -42,13 +42,13 @@ struct StructDenyUnknown {
|
|||||||
|
|
||||||
#[derive(PartialEq, Debug, Deserialize)]
|
#[derive(PartialEq, Debug, Deserialize)]
|
||||||
enum Enum {
|
enum Enum {
|
||||||
|
#[allow(dead_code)]
|
||||||
|
#[serde(skip_deserializing)]
|
||||||
|
Skipped,
|
||||||
Unit,
|
Unit,
|
||||||
Simple(i32),
|
Simple(i32),
|
||||||
Seq(i32, i32, i32),
|
Seq(i32, i32, i32),
|
||||||
Map { a: i32, b: i32, c: i32 },
|
Map { a: i32, b: i32, c: i32 },
|
||||||
#[allow(dead_code)]
|
|
||||||
#[serde(skip_deserializing)]
|
|
||||||
Skipped,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
Reference in New Issue
Block a user