Skip to content

Commit cb6eaea

Browse files
Mingunoli-obk
authored andcommitted
Fix roundtrip inconsistency:
- deserialization of flatten unit variant is possible - serialization of such variant gives Err("can only flatten structs and maps (got an enum)")
1 parent b6f339c commit cb6eaea

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

serde/src/private/ser.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ enum Unsupported {
5454
Sequence,
5555
Tuple,
5656
TupleStruct,
57+
#[cfg(not(any(feature = "std", feature = "alloc")))]
5758
Enum,
5859
}
5960

@@ -70,6 +71,7 @@ impl Display for Unsupported {
7071
Unsupported::Sequence => formatter.write_str("a sequence"),
7172
Unsupported::Tuple => formatter.write_str("a tuple"),
7273
Unsupported::TupleStruct => formatter.write_str("a tuple struct"),
74+
#[cfg(not(any(feature = "std", feature = "alloc")))]
7375
Unsupported::Enum => formatter.write_str("an enum"),
7476
}
7577
}
@@ -1095,9 +1097,9 @@ where
10951097
self,
10961098
_: &'static str,
10971099
_: u32,
1098-
_: &'static str,
1100+
variant: &'static str,
10991101
) -> Result<Self::Ok, Self::Error> {
1100-
Err(Self::bad_type(Unsupported::Enum))
1102+
self.0.serialize_entry(variant, &())
11011103
}
11021104

11031105
fn serialize_newtype_struct<T>(

test_suite/tests/test_annotations.rs

+35
Original file line numberDiff line numberDiff line change
@@ -2655,11 +2655,46 @@ mod flatten {
26552655

26562656
#[derive(Debug, PartialEq, Serialize, Deserialize)]
26572657
enum Enum {
2658+
Unit,
26582659
Newtype(HashMap<String, String>),
26592660
Tuple(u32, u32),
26602661
Struct { index: u32, value: u32 },
26612662
}
26622663

2664+
#[test]
2665+
fn unit() {
2666+
let value = Flatten {
2667+
data: Enum::Unit,
2668+
extra: HashMap::from_iter([("extra_key".into(), "extra value".into())]),
2669+
};
2670+
assert_tokens(
2671+
&value,
2672+
&[
2673+
Token::Map { len: None },
2674+
// data
2675+
Token::Str("Unit"), // variant
2676+
Token::Unit,
2677+
// extra
2678+
Token::Str("extra_key"),
2679+
Token::Str("extra value"),
2680+
Token::MapEnd,
2681+
],
2682+
);
2683+
assert_de_tokens(
2684+
&value,
2685+
&[
2686+
Token::Map { len: None },
2687+
// extra
2688+
Token::Str("extra_key"),
2689+
Token::Str("extra value"),
2690+
// data
2691+
Token::Str("Unit"), // variant
2692+
Token::Unit,
2693+
Token::MapEnd,
2694+
],
2695+
);
2696+
}
2697+
26632698
#[test]
26642699
fn newtype() {
26652700
assert_tokens(

0 commit comments

Comments
 (0)