From 0ecc730e64ebf9fc12e81fe2f580634b338086ab Mon Sep 17 00:00:00 2001 From: Sam Sieber Date: Mon, 19 Nov 2018 08:59:04 -0700 Subject: [PATCH] Fix struct newtype deserialization (and add tests) --- src/de.rs | 11 ++++++++++- tests/test_deserialize.rs | 11 +++++++++++ tests/test_serialize.rs | 12 ++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/de.rs b/src/de.rs index eeb5ff36..46b640ff 100644 --- a/src/de.rs +++ b/src/de.rs @@ -208,6 +208,16 @@ impl<'de> de::Deserializer<'de> for Part<'de> { visitor.visit_enum(ValueEnumAccess(self.0)) } + fn deserialize_newtype_struct( + self, + _name: &'static str, + visitor: V, + ) -> Result + where V: de::Visitor<'de>, + { + visitor.visit_newtype_struct(self) + } + forward_to_deserialize_any! { char str @@ -216,7 +226,6 @@ impl<'de> de::Deserializer<'de> for Part<'de> { bytes byte_buf unit_struct - newtype_struct tuple_struct struct identifier diff --git a/tests/test_deserialize.rs b/tests/test_deserialize.rs index ee19374c..a0065066 100644 --- a/tests/test_deserialize.rs +++ b/tests/test_deserialize.rs @@ -2,6 +2,17 @@ extern crate serde_urlencoded; #[macro_use] extern crate serde_derive; +#[derive(Deserialize, Debug, PartialEq)] +struct NewType(T); + +#[test] +fn deserialize_newtype_i32() { + let result = vec![("field".to_owned(), NewType(11))]; + + assert_eq!(serde_urlencoded::from_str("field=11"), + Ok(result)); +} + #[test] fn deserialize_bytes() { let result = vec![("first".to_owned(), 23), ("last".to_owned(), 42)]; diff --git a/tests/test_serialize.rs b/tests/test_serialize.rs index 3905ce6b..5f2b95ef 100644 --- a/tests/test_serialize.rs +++ b/tests/test_serialize.rs @@ -2,6 +2,18 @@ extern crate serde_urlencoded; #[macro_use] extern crate serde_derive; +#[derive(Serialize)] +struct NewType(T); + +#[test] +fn serialize_newtype_i32() { + let params = &[("field", Some(NewType(11))),]; + assert_eq!( + serde_urlencoded::to_string(params), + Ok("field=11".to_owned()) + ); +} + #[test] fn serialize_option_map_int() { let params = &[("first", Some(23)), ("middle", None), ("last", Some(42))];