From 732ac49321fc65a47dac1b48ca12dd6fdba3b23c Mon Sep 17 00:00:00 2001 From: Mingun Date: Sun, 30 Apr 2023 01:57:48 +0500 Subject: [PATCH 1/2] Implement PartialEq for IgnoredAny so it can be used in tests --- serde/src/de/ignored_any.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/serde/src/de/ignored_any.rs b/serde/src/de/ignored_any.rs index 9ed438e7..34f2271b 100644 --- a/serde/src/de/ignored_any.rs +++ b/serde/src/de/ignored_any.rs @@ -108,7 +108,7 @@ use de::{ /// # Ok(()) /// # } /// ``` -#[derive(Copy, Clone, Debug, Default)] +#[derive(Copy, Clone, Debug, Default, PartialEq)] pub struct IgnoredAny; impl<'de> Visitor<'de> for IgnoredAny { From 51799dd654b916d1d27c748d2665c0d92c420534 Mon Sep 17 00:00:00 2001 From: Mingun Date: Sun, 30 Apr 2023 01:18:42 +0500 Subject: [PATCH 2/2] Allow to flatten IgnoredAny to ignore any additional data Although any additional fields in struct by default are ignored, sometimes this can be useful, if you use generic structures, for example --- serde/src/private/de.rs | 8 +++++++- test_suite/tests/test_annotations.rs | 27 ++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/serde/src/private/de.rs b/serde/src/private/de.rs index e9c693d4..67dcebf6 100644 --- a/serde/src/private/de.rs +++ b/serde/src/private/de.rs @@ -2811,6 +2811,13 @@ where visitor.visit_unit() } + fn deserialize_ignored_any(self, visitor: V) -> Result + where + V: Visitor<'de>, + { + visitor.visit_unit() + } + forward_to_deserialize_other! { deserialize_bool() deserialize_i8() @@ -2833,7 +2840,6 @@ where deserialize_tuple(usize) deserialize_tuple_struct(&'static str, usize) deserialize_identifier() - deserialize_ignored_any() } } diff --git a/test_suite/tests/test_annotations.rs b/test_suite/tests/test_annotations.rs index 8ff725e0..1bbe757c 100644 --- a/test_suite/tests/test_annotations.rs +++ b/test_suite/tests/test_annotations.rs @@ -10,7 +10,7 @@ clippy::uninlined_format_args, )] -use serde::de::{self, MapAccess, Unexpected, Visitor}; +use serde::de::{self, IgnoredAny, MapAccess, Unexpected, Visitor}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::collections::{BTreeMap, HashMap}; @@ -2494,6 +2494,31 @@ fn test_flatten_option() { ); } +#[test] +fn test_flatten_ignored_any() { + #[derive(Deserialize, PartialEq, Debug)] + struct Outer { + #[serde(flatten)] + inner: IgnoredAny, + } + + assert_de_tokens( + &Outer { inner: IgnoredAny }, + &[Token::Map { len: None }, Token::MapEnd], + ); + + assert_de_tokens( + &Outer { inner: IgnoredAny }, + &[ + Token::Struct { + name: "DoNotMatter", + len: 0, + }, + Token::StructEnd, + ], + ); +} + #[test] fn test_transparent_struct() { #[derive(Serialize, Deserialize, PartialEq, Debug)]