Merge #45
45: Fix struct newtype deserialization (and add tests) r=nox a=samsieber Fixes #41 I only had to fix the deserializer - the serialization already works. So now they work the same way - you can serialize something and then deserialize it losslessly. I also added tests for serialization and deserialization. Let me know if there's anything you'd like changed. Co-authored-by: Sam Sieber <swsieber@gmail.com>
This commit is contained in:
commit
11cc5bb88f
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "serde_urlencoded"
|
name = "serde_urlencoded"
|
||||||
version = "0.5.3"
|
version = "0.5.4"
|
||||||
authors = ["Anthony Ramine <n.oxyde@gmail.com>"]
|
authors = ["Anthony Ramine <n.oxyde@gmail.com>"]
|
||||||
license = "MIT/Apache-2.0"
|
license = "MIT/Apache-2.0"
|
||||||
repository = "https://github.com/nox/serde_urlencoded"
|
repository = "https://github.com/nox/serde_urlencoded"
|
||||||
|
11
src/de.rs
11
src/de.rs
@ -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
|
||||||
|
@ -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)];
|
||||||
|
@ -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))];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user