Fix struct newtype deserialization (and add tests)

This commit is contained in:
Sam Sieber 2018-11-19 08:59:04 -07:00
parent 199ed02274
commit 0ecc730e64
3 changed files with 33 additions and 1 deletions

View File

@ -208,6 +208,16 @@ impl<'de> de::Deserializer<'de> for Part<'de> {
visitor.visit_enum(ValueEnumAccess(self.0)) visitor.visit_enum(ValueEnumAccess(self.0))
} }
fn deserialize_newtype_struct<V>(
self,
_name: &'static str,
visitor: V,
) -> Result<V::Value, Self::Error>
where V: de::Visitor<'de>,
{
visitor.visit_newtype_struct(self)
}
forward_to_deserialize_any! { forward_to_deserialize_any! {
char char
str str
@ -216,7 +226,6 @@ impl<'de> de::Deserializer<'de> for Part<'de> {
bytes bytes
byte_buf byte_buf
unit_struct unit_struct
newtype_struct
tuple_struct tuple_struct
struct struct
identifier identifier

View File

@ -2,6 +2,17 @@ extern crate serde_urlencoded;
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
#[derive(Deserialize, Debug, PartialEq)]
struct NewType<T>(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] #[test]
fn deserialize_bytes() { fn deserialize_bytes() {
let result = vec![("first".to_owned(), 23), ("last".to_owned(), 42)]; let result = vec![("first".to_owned(), 23), ("last".to_owned(), 42)];

View File

@ -2,6 +2,18 @@ extern crate serde_urlencoded;
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
#[derive(Serialize)]
struct NewType<T>(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] #[test]
fn serialize_option_map_int() { fn serialize_option_map_int() {
let params = &[("first", Some(23)), ("middle", None), ("last", Some(42))]; let params = &[("first", Some(23)), ("middle", None), ("last", Some(42))];