From 51799dd654b916d1d27c748d2665c0d92c420534 Mon Sep 17 00:00:00 2001 From: Mingun Date: Sun, 30 Apr 2023 01:18:42 +0500 Subject: [PATCH] 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)]