mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-04-27 14:37:55 +00:00
Merge pull request #1805 from dtolnay/skip
Fix indexing bug when `skip` and `other` are combined
This commit is contained in:
@@ -1153,10 +1153,13 @@ fn prepare_enum_variant_enum(
|
||||
variants: &[Variant],
|
||||
cattrs: &attr::Container,
|
||||
) -> (TokenStream, Stmts) {
|
||||
let variant_names_idents: Vec<_> = variants
|
||||
let mut deserialized_variants = variants
|
||||
.iter()
|
||||
.enumerate()
|
||||
.filter(|&(_, variant)| !variant.attrs.skip_deserializing())
|
||||
.filter(|&(_, variant)| !variant.attrs.skip_deserializing());
|
||||
|
||||
let variant_names_idents: Vec<_> = deserialized_variants
|
||||
.clone()
|
||||
.map(|(i, variant)| {
|
||||
(
|
||||
variant.attrs.name().deserialize_name(),
|
||||
@@ -1166,7 +1169,7 @@ fn prepare_enum_variant_enum(
|
||||
})
|
||||
.collect();
|
||||
|
||||
let other_idx = variants.iter().position(|variant| variant.attrs.other());
|
||||
let other_idx = deserialized_variants.position(|(_, variant)| variant.attrs.other());
|
||||
|
||||
let variants_stmt = {
|
||||
let variant_names = variant_names_idents.iter().map(|(name, _, _)| name);
|
||||
|
||||
@@ -691,6 +691,16 @@ fn test_gen() {
|
||||
#[serde(flatten, skip_deserializing)]
|
||||
flat: T,
|
||||
}
|
||||
|
||||
// https://github.com/serde-rs/serde/issues/1804
|
||||
#[derive(Serialize, Deserialize)]
|
||||
enum Message {
|
||||
#[serde(skip)]
|
||||
#[allow(dead_code)]
|
||||
String(String),
|
||||
#[serde(other)]
|
||||
Unknown,
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Reference in New Issue
Block a user