From 6e2c385fa55d223e3d9dd22ff126f81b4903e05b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?A=CC=81rpa=CC=81d=20Goretity?= Date: Wed, 6 Nov 2019 17:31:27 +0100 Subject: [PATCH 1/4] Allow untagged unit variants to deserialize from `Visitor::visit_none()` --- serde/src/private/de.rs | 7 +++++++ test_suite/tests/test_de.rs | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/serde/src/private/de.rs b/serde/src/private/de.rs index ffa5012dc..1c7fda3a1 100644 --- a/serde/src/private/de.rs +++ b/serde/src/private/de.rs @@ -2510,6 +2510,13 @@ mod content { { Ok(()) } + + fn visit_none(self) -> Result<(), E> + where + E: de::Error, + { + Ok(()) + } } } diff --git a/test_suite/tests/test_de.rs b/test_suite/tests/test_de.rs index 025d87b09..a1da9509c 100644 --- a/test_suite/tests/test_de.rs +++ b/test_suite/tests/test_de.rs @@ -137,6 +137,12 @@ enum EnumOther { Other, } +#[derive(PartialEq, Debug, Deserialize)] +#[serde(untagged)] +enum EnumUntaggedUnit { + Unit, +} + #[derive(PartialEq, Debug)] struct IgnoredAny; @@ -788,6 +794,9 @@ declare_tests! { Token::Unit, ], } + test_enum_untagged_unit_from_none { + UntaggedUnit::Unit => &[Token::None], + } test_box { Box::new(0i32) => &[Token::I32(0)], } From c796daed7cacc90e398300f130f8c60421762bfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?A=CC=81rpa=CC=81d=20Goretity?= Date: Thu, 7 Nov 2019 12:58:09 +0100 Subject: [PATCH 2/4] Fix test for untagged unit variant --- test_suite/tests/test_de.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test_suite/tests/test_de.rs b/test_suite/tests/test_de.rs index a1da9509c..d9a0c8a40 100644 --- a/test_suite/tests/test_de.rs +++ b/test_suite/tests/test_de.rs @@ -795,7 +795,7 @@ declare_tests! { ], } test_enum_untagged_unit_from_none { - UntaggedUnit::Unit => &[Token::None], + EnumUntaggedUnit::Unit => &[Token::None], } test_box { Box::new(0i32) => &[Token::I32(0)], From 59b99d2d60cca145bb82ad973de262405d5b77e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?A=CC=81rpa=CC=81d=20Goretity?= Date: Thu, 7 Nov 2019 21:18:12 +0100 Subject: [PATCH 3/4] Move test for untagged-variant-from-unit where it belongs --- test_suite/tests/test_de.rs | 9 --------- test_suite/tests/test_macros.rs | 6 +----- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/test_suite/tests/test_de.rs b/test_suite/tests/test_de.rs index d9a0c8a40..025d87b09 100644 --- a/test_suite/tests/test_de.rs +++ b/test_suite/tests/test_de.rs @@ -137,12 +137,6 @@ enum EnumOther { Other, } -#[derive(PartialEq, Debug, Deserialize)] -#[serde(untagged)] -enum EnumUntaggedUnit { - Unit, -} - #[derive(PartialEq, Debug)] struct IgnoredAny; @@ -794,9 +788,6 @@ declare_tests! { Token::Unit, ], } - test_enum_untagged_unit_from_none { - EnumUntaggedUnit::Unit => &[Token::None], - } test_box { Box::new(0i32) => &[Token::I32(0)], } diff --git a/test_suite/tests/test_macros.rs b/test_suite/tests/test_macros.rs index c4eb06f36..d18b210ee 100644 --- a/test_suite/tests/test_macros.rs +++ b/test_suite/tests/test_macros.rs @@ -638,6 +638,7 @@ fn test_untagged_enum() { ); assert_tokens(&Untagged::C, &[Token::Unit]); + assert_tokens(&Untagged::C, &[Token::None]); assert_tokens(&Untagged::D(4), &[Token::U8(4)]); assert_tokens(&Untagged::E("e".to_owned()), &[Token::Str("e")]); @@ -652,11 +653,6 @@ fn test_untagged_enum() { ], ); - assert_de_tokens_error::( - &[Token::None], - "data did not match any variant of untagged enum Untagged", - ); - assert_de_tokens_error::( &[Token::Tuple { len: 1 }, Token::U8(1), Token::TupleEnd], "data did not match any variant of untagged enum Untagged", From 97a98a7031d051328f0d2841fdfe68d89029764f Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sun, 24 Nov 2019 15:59:08 -0800 Subject: [PATCH 4/4] Test only deser for untagged unit visit_none --- test_suite/tests/test_macros.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test_suite/tests/test_macros.rs b/test_suite/tests/test_macros.rs index d18b210ee..d4456bed7 100644 --- a/test_suite/tests/test_macros.rs +++ b/test_suite/tests/test_macros.rs @@ -637,8 +637,10 @@ fn test_untagged_enum() { ], ); + // Serializes to unit, deserializes from either depending on format's + // preference. assert_tokens(&Untagged::C, &[Token::Unit]); - assert_tokens(&Untagged::C, &[Token::None]); + assert_de_tokens(&Untagged::C, &[Token::None]); assert_tokens(&Untagged::D(4), &[Token::U8(4)]); assert_tokens(&Untagged::E("e".to_owned()), &[Token::Str("e")]);