Skip to content

Commit cbd1cbe

Browse files
authored
Merge pull request #2387 from bebecue/fix-1504
Make #[serde(alias)] works in #[serde(flatten)] context
2 parents a13c638 + 01da3f7 commit cbd1cbe

File tree

2 files changed

+69
-6
lines changed

2 files changed

+69
-6
lines changed

serde_derive/src/de.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -2400,7 +2400,8 @@ fn deserialize_struct_as_struct_visitor(
24002400
.collect();
24012401

24022402
let fields_stmt = {
2403-
let field_names = field_names_idents.iter().map(|(name, _, _)| name);
2403+
let field_names = field_names_idents.iter().flat_map(|(_, _, aliases)| aliases);
2404+
24042405
quote_block! {
24052406
const FIELDS: &'static [&'static str] = &[ #(#field_names),* ];
24062407
}

test_suite/tests/test_annotations.rs

+67-5
Original file line numberDiff line numberDiff line change
@@ -642,7 +642,7 @@ fn test_unknown_field_rename_struct() {
642642
Token::Str("a4"),
643643
Token::I32(3),
644644
],
645-
"unknown field `a4`, expected one of `a1`, `a2`, `a6`",
645+
"unknown field `a4`, expected one of `a1`, `a3`, `a2`, `a5`, `a6`",
646646
);
647647
}
648648

@@ -780,7 +780,7 @@ fn test_rename_enum() {
780780
Token::StructVariant {
781781
name: "AliasEnum",
782782
variant: "sailor_moon",
783-
len: 3,
783+
len: 5,
784784
},
785785
Token::Str("a"),
786786
Token::I8(0),
@@ -798,7 +798,7 @@ fn test_rename_enum() {
798798
Token::StructVariant {
799799
name: "AliasEnum",
800800
variant: "usagi_tsukino",
801-
len: 3,
801+
len: 5,
802802
},
803803
Token::Str("a"),
804804
Token::I8(0),
@@ -827,7 +827,7 @@ fn test_unknown_field_rename_enum() {
827827
Token::StructVariant {
828828
name: "AliasEnum",
829829
variant: "usagi_tsukino",
830-
len: 3,
830+
len: 5,
831831
},
832832
Token::Str("a"),
833833
Token::I8(0),
@@ -836,7 +836,7 @@ fn test_unknown_field_rename_enum() {
836836
Token::Str("d"),
837837
Token::I8(2),
838838
],
839-
"unknown field `d`, expected one of `a`, `b`, `f`",
839+
"unknown field `d`, expected one of `a`, `c`, `b`, `e`, `f`",
840840
);
841841
}
842842

@@ -2658,6 +2658,68 @@ fn test_flatten_any_after_flatten_struct() {
26582658
);
26592659
}
26602660

2661+
#[test]
2662+
fn test_alias_in_flatten_context() {
2663+
#[derive(Debug, PartialEq, Deserialize)]
2664+
struct Outer {
2665+
#[serde(flatten)]
2666+
a: AliasStruct,
2667+
b: i32,
2668+
}
2669+
2670+
assert_de_tokens(
2671+
&Outer {
2672+
a: AliasStruct {
2673+
a1: 1,
2674+
a2: 2,
2675+
a4: 4,
2676+
},
2677+
b: 7,
2678+
},
2679+
&[
2680+
Token::Struct {
2681+
name: "Outer",
2682+
len: 4,
2683+
},
2684+
Token::Str("a1"),
2685+
Token::I32(1),
2686+
Token::Str("a2"),
2687+
Token::I32(2),
2688+
Token::Str("a5"),
2689+
Token::I32(4),
2690+
Token::Str("b"),
2691+
Token::I32(7),
2692+
Token::StructEnd,
2693+
],
2694+
);
2695+
2696+
assert_de_tokens(
2697+
&Outer {
2698+
a: AliasStruct {
2699+
a1: 1,
2700+
a2: 2,
2701+
a4: 4,
2702+
},
2703+
b: 7,
2704+
},
2705+
&[
2706+
Token::Struct {
2707+
name: "Outer",
2708+
len: 4,
2709+
},
2710+
Token::Str("a1"),
2711+
Token::I32(1),
2712+
Token::Str("a2"),
2713+
Token::I32(2),
2714+
Token::Str("a6"),
2715+
Token::I32(4),
2716+
Token::Str("b"),
2717+
Token::I32(7),
2718+
Token::StructEnd,
2719+
],
2720+
);
2721+
}
2722+
26612723
#[test]
26622724
fn test_expecting_message() {
26632725
#[derive(Deserialize, PartialEq, Debug)]

0 commit comments

Comments
 (0)