From a376cfd1b42bd47df433aa106c7c172f37d276aa Mon Sep 17 00:00:00 2001 From: Ed Page Date: Tue, 26 Sep 2023 16:17:45 -0500 Subject: [PATCH] fix(serde): Allow newtypes for keys Fixes #586 --- crates/toml/tests/testsuite/serde.rs | 1 - crates/toml_edit/src/de/key.rs | 13 ++++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/crates/toml/tests/testsuite/serde.rs b/crates/toml/tests/testsuite/serde.rs index ae762b3d..d9d7a6db 100644 --- a/crates/toml/tests/testsuite/serde.rs +++ b/crates/toml/tests/testsuite/serde.rs @@ -743,7 +743,6 @@ fn newtype_variant() { } #[test] -#[should_panic = "invalid type: string \"x\", expected tuple struct NewType"] fn newtype_key() { #[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Clone, Serialize, Deserialize)] struct NewType(String); diff --git a/crates/toml_edit/src/de/key.rs b/crates/toml_edit/src/de/key.rs index 3da41df4..a3b28256 100644 --- a/crates/toml_edit/src/de/key.rs +++ b/crates/toml_edit/src/de/key.rs @@ -62,9 +62,20 @@ impl<'de> serde::de::Deserializer<'de> for KeyDeserializer { self.deserialize_any(visitor) } + fn deserialize_newtype_struct( + self, + _name: &'static str, + visitor: V, + ) -> Result + where + V: serde::de::Visitor<'de>, + { + visitor.visit_newtype_struct(self) + } + serde::forward_to_deserialize_any! { bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq - bytes byte_buf map option unit newtype_struct + bytes byte_buf map option unit ignored_any unit_struct tuple_struct tuple identifier } }