From 26186bddd1e4c194d144d9684d5189ce5f3865a4 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Mon, 10 Aug 2020 15:06:34 -0700 Subject: [PATCH 1/3] Add test for flattened unit --- test_suite/tests/test_annotations.rs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/test_suite/tests/test_annotations.rs b/test_suite/tests/test_annotations.rs index 06c485df..7604fe03 100644 --- a/test_suite/tests/test_annotations.rs +++ b/test_suite/tests/test_annotations.rs @@ -1967,6 +1967,29 @@ fn test_flatten_map_twice() { ); } +#[test] +fn test_flatten_unit() { + #[derive(Debug, PartialEq, Serialize, Deserialize)] + struct Response { + #[serde(flatten)] + data: T, + status: usize, + } + + assert_tokens( + &Response { + data: (), + status: 0, + }, + &[ + Token::Map { len: None }, + Token::Str("status"), + Token::U64(0), + Token::MapEnd, + ], + ); +} + #[test] fn test_flatten_unsupported_type() { #[derive(Debug, PartialEq, Serialize, Deserialize)] From ba0707559026b7dacef46de044a0da54ef64d50a Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Mon, 10 Aug 2020 15:06:47 -0700 Subject: [PATCH 2/3] Support serializing flattened unit --- serde/src/private/ser.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/serde/src/private/ser.rs b/serde/src/private/ser.rs index 70f33818..eb8cfc98 100644 --- a/serde/src/private/ser.rs +++ b/serde/src/private/ser.rs @@ -1124,7 +1124,7 @@ where } fn serialize_unit(self) -> Result { - Err(Self::bad_type(Unsupported::Unit)) + Ok(()) } fn serialize_unit_struct(self, _: &'static str) -> Result { From bf76f502942b31da3e755c2775128d88edac27d1 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Mon, 10 Aug 2020 15:06:52 -0700 Subject: [PATCH 3/3] Support deserializing flattened unit --- serde/src/private/de.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/serde/src/private/de.rs b/serde/src/private/de.rs index eb5424cc..bcb964a9 100644 --- a/serde/src/private/de.rs +++ b/serde/src/private/de.rs @@ -2763,6 +2763,13 @@ where } } + fn deserialize_unit(self, visitor: V) -> Result + where + V: Visitor<'de>, + { + visitor.visit_unit() + } + forward_to_deserialize_other! { deserialize_bool() deserialize_i8() @@ -2780,7 +2787,6 @@ where deserialize_string() deserialize_bytes() deserialize_byte_buf() - deserialize_unit() deserialize_unit_struct(&'static str) deserialize_seq() deserialize_tuple(usize)