Compare commits

...

9 Commits

Author SHA1 Message Date
David Tolnay 893c0578dd Release 1.0.44 2018-05-01 22:34:27 -07:00
David Tolnay cb2b92f828 Handle flatten + deserialize_with 2018-05-01 22:25:06 -07:00
David Tolnay 47a4ffbd31 Fill in missing fully qualified paths in flatten 2018-05-01 22:24:25 -07:00
David Tolnay d82d1707d6 Format with rustfmt 0.6.0 2018-04-30 01:42:46 -07:00
David Tolnay 89278996c5 Release 1.0.43 2018-04-23 11:23:58 -07:00
David Tolnay ecef937e26 Merge pull request #1234 from serde-rs/newtype
Unpack a layer of NewtypeStruct when content is newtype
2018-04-23 11:23:21 -07:00
David Tolnay bceda5fb18 Unpack a layer of NewtypeStruct when content is newtype 2018-04-23 11:04:42 -07:00
David Tolnay f46a08b04e Merge pull request #1231 from ignatenkobrain/patch-1
derive: bump min version of quote to 0.5.2
2018-04-22 16:48:11 -07:00
Igor Gnatenko f3cb7c7a32 derive: bump min version of quote to 0.5.2
Fixes: https://github.com/serde-rs/serde/issues/1230
2018-04-22 09:22:47 +02:00
18 changed files with 257 additions and 207 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde" name = "serde"
version = "1.0.42" # remember to update html_root_url version = "1.0.44" # remember to update html_root_url
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
license = "MIT/Apache-2.0" license = "MIT/Apache-2.0"
description = "A generic serialization/deserialization framework" description = "A generic serialization/deserialization framework"
+3
View File
@@ -16,6 +16,9 @@ pub use lib::result::Result::{self, Err, Ok};
pub use self::string::from_utf8_lossy; pub use self::string::from_utf8_lossy;
#[cfg(any(feature = "alloc", feature = "std"))]
pub use lib::Vec;
mod string { mod string {
use lib::*; use lib::*;
+1 -1
View File
@@ -79,7 +79,7 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Serde types in rustdoc of other crates get linked to here. // Serde types in rustdoc of other crates get linked to here.
#![doc(html_root_url = "https://docs.rs/serde/1.0.42")] #![doc(html_root_url = "https://docs.rs/serde/1.0.44")]
// Support using Serde without the standard library! // Support using Serde without the standard library!
#![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(not(feature = "std"), no_std)]
// Unstable functionality only if the user asks for it. For tracking and // Unstable functionality only if the user asks for it. For tracking and
+10 -2
View File
@@ -1310,7 +1310,10 @@ mod content {
where where
V: Visitor<'de>, V: Visitor<'de>,
{ {
visitor.visit_newtype_struct(self) match self.content {
Content::Newtype(v) => visitor.visit_newtype_struct(ContentDeserializer::new(*v)),
_ => visitor.visit_newtype_struct(self),
}
} }
fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
@@ -2001,7 +2004,12 @@ mod content {
where where
V: Visitor<'de>, V: Visitor<'de>,
{ {
visitor.visit_newtype_struct(self) match *self.content {
Content::Newtype(ref v) => {
visitor.visit_newtype_struct(ContentRefDeserializer::new(v))
}
_ => visitor.visit_newtype_struct(self),
}
} }
fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error> fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
+2 -2
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde_derive" name = "serde_derive"
version = "1.0.42" # remember to update html_root_url version = "1.0.44" # remember to update html_root_url
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
license = "MIT/Apache-2.0" license = "MIT/Apache-2.0"
description = "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]" description = "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]"
@@ -24,7 +24,7 @@ proc-macro = true
[dependencies] [dependencies]
proc-macro2 = "0.3" proc-macro2 = "0.3"
quote = "0.5" quote = "0.5.2"
serde_derive_internals = { version = "=0.23.1", default-features = false, path = "../serde_derive_internals" } serde_derive_internals = { version = "=0.23.1", default-features = false, path = "../serde_derive_internals" }
syn = { version = "0.13", features = ["visit"] } syn = { version = "0.13", features = ["visit"] }
+35 -31
View File
@@ -1941,82 +1941,82 @@ fn deserialize_identifier(
let fallthrough_msg = format!("{} index 0 <= i < {}", index_expecting, fields.len()); let fallthrough_msg = format!("{} index 0 <= i < {}", index_expecting, fields.len());
let visit_other = if collect_other_fields { let visit_other = if collect_other_fields {
quote! { quote! {
fn visit_bool<__E>(self, __value: bool) -> Result<Self::Value, __E> fn visit_bool<__E>(self, __value: bool) -> _serde::export::Result<Self::Value, __E>
where __E: _serde::de::Error where __E: _serde::de::Error
{ {
Ok(__Field::__other(_serde::private::de::Content::Bool(__value))) _serde::export::Ok(__Field::__other(_serde::private::de::Content::Bool(__value)))
} }
fn visit_i8<__E>(self, __value: i8) -> Result<Self::Value, __E> fn visit_i8<__E>(self, __value: i8) -> _serde::export::Result<Self::Value, __E>
where __E: _serde::de::Error where __E: _serde::de::Error
{ {
Ok(__Field::__other(_serde::private::de::Content::I8(__value))) _serde::export::Ok(__Field::__other(_serde::private::de::Content::I8(__value)))
} }
fn visit_i16<__E>(self, __value: i16) -> Result<Self::Value, __E> fn visit_i16<__E>(self, __value: i16) -> _serde::export::Result<Self::Value, __E>
where __E: _serde::de::Error where __E: _serde::de::Error
{ {
Ok(__Field::__other(_serde::private::de::Content::I16(__value))) _serde::export::Ok(__Field::__other(_serde::private::de::Content::I16(__value)))
} }
fn visit_i32<__E>(self, __value: i32) -> Result<Self::Value, __E> fn visit_i32<__E>(self, __value: i32) -> _serde::export::Result<Self::Value, __E>
where __E: _serde::de::Error where __E: _serde::de::Error
{ {
Ok(__Field::__other(_serde::private::de::Content::I32(__value))) _serde::export::Ok(__Field::__other(_serde::private::de::Content::I32(__value)))
} }
fn visit_i64<__E>(self, __value: i64) -> Result<Self::Value, __E> fn visit_i64<__E>(self, __value: i64) -> _serde::export::Result<Self::Value, __E>
where __E: _serde::de::Error where __E: _serde::de::Error
{ {
Ok(__Field::__other(_serde::private::de::Content::I64(__value))) _serde::export::Ok(__Field::__other(_serde::private::de::Content::I64(__value)))
} }
fn visit_u8<__E>(self, __value: u8) -> Result<Self::Value, __E> fn visit_u8<__E>(self, __value: u8) -> _serde::export::Result<Self::Value, __E>
where __E: _serde::de::Error where __E: _serde::de::Error
{ {
Ok(__Field::__other(_serde::private::de::Content::U8(__value))) _serde::export::Ok(__Field::__other(_serde::private::de::Content::U8(__value)))
} }
fn visit_u16<__E>(self, __value: u16) -> Result<Self::Value, __E> fn visit_u16<__E>(self, __value: u16) -> _serde::export::Result<Self::Value, __E>
where __E: _serde::de::Error where __E: _serde::de::Error
{ {
Ok(__Field::__other(_serde::private::de::Content::U16(__value))) _serde::export::Ok(__Field::__other(_serde::private::de::Content::U16(__value)))
} }
fn visit_u32<__E>(self, __value: u32) -> Result<Self::Value, __E> fn visit_u32<__E>(self, __value: u32) -> _serde::export::Result<Self::Value, __E>
where __E: _serde::de::Error where __E: _serde::de::Error
{ {
Ok(__Field::__other(_serde::private::de::Content::U32(__value))) _serde::export::Ok(__Field::__other(_serde::private::de::Content::U32(__value)))
} }
fn visit_u64<__E>(self, __value: u64) -> Result<Self::Value, __E> fn visit_u64<__E>(self, __value: u64) -> _serde::export::Result<Self::Value, __E>
where __E: _serde::de::Error where __E: _serde::de::Error
{ {
Ok(__Field::__other(_serde::private::de::Content::U64(__value))) _serde::export::Ok(__Field::__other(_serde::private::de::Content::U64(__value)))
} }
fn visit_f32<__E>(self, __value: f32) -> Result<Self::Value, __E> fn visit_f32<__E>(self, __value: f32) -> _serde::export::Result<Self::Value, __E>
where __E: _serde::de::Error where __E: _serde::de::Error
{ {
Ok(__Field::__other(_serde::private::de::Content::F32(__value))) _serde::export::Ok(__Field::__other(_serde::private::de::Content::F32(__value)))
} }
fn visit_f64<__E>(self, __value: f64) -> Result<Self::Value, __E> fn visit_f64<__E>(self, __value: f64) -> _serde::export::Result<Self::Value, __E>
where __E: _serde::de::Error where __E: _serde::de::Error
{ {
Ok(__Field::__other(_serde::private::de::Content::F64(__value))) _serde::export::Ok(__Field::__other(_serde::private::de::Content::F64(__value)))
} }
fn visit_char<__E>(self, __value: char) -> Result<Self::Value, __E> fn visit_char<__E>(self, __value: char) -> _serde::export::Result<Self::Value, __E>
where __E: _serde::de::Error where __E: _serde::de::Error
{ {
Ok(__Field::__other(_serde::private::de::Content::Char(__value))) _serde::export::Ok(__Field::__other(_serde::private::de::Content::Char(__value)))
} }
fn visit_unit<__E>(self) -> Result<Self::Value, __E> fn visit_unit<__E>(self) -> _serde::export::Result<Self::Value, __E>
where __E: _serde::de::Error where __E: _serde::de::Error
{ {
Ok(__Field::__other(_serde::private::de::Content::Unit)) _serde::export::Ok(__Field::__other(_serde::private::de::Content::Unit))
} }
fn visit_borrowed_str<__E>(self, __value: &'de str) -> _serde::export::Result<Self::Value, __E> fn visit_borrowed_str<__E>(self, __value: &'de str) -> _serde::export::Result<Self::Value, __E>
@@ -2179,7 +2179,7 @@ fn deserialize_map(
// Collect contents for flatten fields into a buffer // Collect contents for flatten fields into a buffer
let let_collect = if cattrs.has_flatten() { let let_collect = if cattrs.has_flatten() {
Some(quote! { Some(quote! {
let mut __collect = Vec::<Option<( let mut __collect = _serde::export::Vec::<_serde::export::Option<(
_serde::private::de::Content, _serde::private::de::Content,
_serde::private::de::Content _serde::private::de::Content
)>>::new(); )>>::new();
@@ -2227,7 +2227,7 @@ fn deserialize_map(
let ignored_arm = if cattrs.has_flatten() { let ignored_arm = if cattrs.has_flatten() {
Some(quote! { Some(quote! {
__Field::__other(__name) => { __Field::__other(__name) => {
__collect.push(Some(( __collect.push(_serde::export::Some((
__name, __name,
try!(_serde::de::MapAccess::next_value(&mut __map))))); try!(_serde::de::MapAccess::next_value(&mut __map)))));
} }
@@ -2279,8 +2279,12 @@ fn deserialize_map(
.filter(|&&(field, _)| field.attrs.flatten()) .filter(|&&(field, _)| field.attrs.flatten())
.map(|&(field, ref name)| { .map(|&(field, ref name)| {
let field_ty = field.ty; let field_ty = field.ty;
let func = match field.attrs.deserialize_with() {
None => quote!(_serde::de::Deserialize::deserialize),
Some(path) => quote!(#path),
};
quote! { quote! {
let #name: #field_ty = try!(_serde::de::Deserialize::deserialize( let #name: #field_ty = try!(#func(
_serde::private::de::FlatMapDeserializer( _serde::private::de::FlatMapDeserializer(
&mut __collect, &mut __collect,
_serde::export::PhantomData))); _serde::export::PhantomData)));
@@ -2289,8 +2293,8 @@ fn deserialize_map(
let collected_deny_unknown_fields = if cattrs.has_flatten() && cattrs.deny_unknown_fields() { let collected_deny_unknown_fields = if cattrs.has_flatten() && cattrs.deny_unknown_fields() {
Some(quote! { Some(quote! {
if let Some(Some((__key, _))) = __collect.into_iter().filter(|x| x.is_some()).next() { if let _serde::export::Some(_serde::export::Some((__key, _))) = __collect.into_iter().filter(|x| x.is_some()).next() {
if let Some(__key) = __key.as_str() { if let _serde::export::Some(__key) = __key.as_str() {
return _serde::export::Err( return _serde::export::Err(
_serde::de::Error::custom(format_args!("unknown field `{}`", &__key))); _serde::de::Error::custom(format_args!("unknown field `{}`", &__key)));
} else { } else {
+1 -1
View File
@@ -22,7 +22,7 @@
//! //!
//! [https://serde.rs/derive.html]: https://serde.rs/derive.html //! [https://serde.rs/derive.html]: https://serde.rs/derive.html
#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.42")] #![doc(html_root_url = "https://docs.rs/serde_derive/1.0.44")]
#![cfg_attr( #![cfg_attr(
feature = "cargo-clippy", feature = "cargo-clippy",
allow(enum_variant_names, redundant_field_names, too_many_arguments, used_underscore_binding) allow(enum_variant_names, redundant_field_names, too_many_arguments, used_underscore_binding)
+1 -1
View File
@@ -1,5 +1,5 @@
use quote::Tokens;
use proc_macro2::{Op, Spacing}; use proc_macro2::{Op, Spacing};
use quote::Tokens;
// None of our generated code requires the `From::from` error conversion // None of our generated code requires the `From::from` error conversion
// performed by the standard library's `try!` macro. With this simplified macro // performed by the standard library's `try!` macro. With this simplified macro
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde_test" name = "serde_test"
version = "1.0.42" # remember to update html_root_url version = "1.0.44" # remember to update html_root_url
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
license = "MIT/Apache-2.0" license = "MIT/Apache-2.0"
description = "Token De/Serializer for testing De/Serialize implementations" description = "Token De/Serializer for testing De/Serialize implementations"
+1 -1
View File
@@ -155,7 +155,7 @@
//! # } //! # }
//! ``` //! ```
#![doc(html_root_url = "https://docs.rs/serde_test/1.0.42")] #![doc(html_root_url = "https://docs.rs/serde_test/1.0.44")]
#![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))] #![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))]
// Whitelisted clippy lints // Whitelisted clippy lints
#![cfg_attr(feature = "cargo-clippy", allow(float_cmp))] #![cfg_attr(feature = "cargo-clippy", allow(float_cmp))]
+13 -7
View File
@@ -1,8 +1,9 @@
use serde::de::{Deserializer, Visitor, SeqAccess, Error}; use serde::de::{Deserializer, Error, SeqAccess, Visitor};
use std::fmt; use std::fmt;
pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error> pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
where D: Deserializer<'de> where
D: Deserializer<'de>,
{ {
deserializer.deserialize_byte_buf(ByteBufVisitor) deserializer.deserialize_byte_buf(ByteBufVisitor)
} }
@@ -17,7 +18,8 @@ impl<'de> Visitor<'de> for ByteBufVisitor {
} }
fn visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error> fn visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
where V: SeqAccess<'de> where
V: SeqAccess<'de>,
{ {
let mut values = Vec::new(); let mut values = Vec::new();
while let Some(value) = try!(visitor.next_element()) { while let Some(value) = try!(visitor.next_element()) {
@@ -27,25 +29,29 @@ impl<'de> Visitor<'de> for ByteBufVisitor {
} }
fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E> fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
where E: Error where
E: Error,
{ {
Ok(v.to_vec()) Ok(v.to_vec())
} }
fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E> fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
where E: Error where
E: Error,
{ {
Ok(v) Ok(v)
} }
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where E: Error where
E: Error,
{ {
Ok(v.as_bytes().to_vec()) Ok(v.as_bytes().to_vec())
} }
fn visit_string<E>(self, v: String) -> Result<Self::Value, E> fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
where E: Error where
E: Error,
{ {
Ok(v.into_bytes()) Ok(v.into_bytes())
} }
+48 -54
View File
@@ -12,9 +12,9 @@
extern crate serde_derive; extern crate serde_derive;
extern crate serde; extern crate serde;
use std::collections::HashMap;
use self::serde::{Deserialize, Deserializer, Serialize, Serializer};
use self::serde::de::{self, Unexpected}; use self::serde::de::{self, Unexpected};
use self::serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::collections::HashMap;
extern crate serde_test; extern crate serde_test;
use self::serde_test::{assert_de_tokens, assert_de_tokens_error, assert_ser_tokens, use self::serde_test::{assert_de_tokens, assert_de_tokens_error, assert_ser_tokens,
@@ -114,10 +114,7 @@ struct FlattenStructEnumWrapper {
#[derive(Debug, PartialEq, Serialize, Deserialize)] #[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")] #[serde(rename_all = "snake_case")]
enum FlattenStructEnum { enum FlattenStructEnum {
InsertInteger { InsertInteger { index: u32, value: u32 },
index: u32,
value: u32
},
} }
#[derive(Debug, PartialEq, Serialize, Deserialize)] #[derive(Debug, PartialEq, Serialize, Deserialize)]
@@ -133,10 +130,7 @@ struct FlattenStructTagContentEnumNewtype(pub FlattenStructTagContentEnum);
#[derive(Debug, PartialEq, Serialize, Deserialize)] #[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case", tag = "type", content = "value")] #[serde(rename_all = "snake_case", tag = "type", content = "value")]
enum FlattenStructTagContentEnum { enum FlattenStructTagContentEnum {
InsertInteger { InsertInteger { index: u32, value: u32 },
index: u32,
value: u32
},
NewtypeVariant(FlattenStructTagContentEnumNewtypeVariant), NewtypeVariant(FlattenStructTagContentEnumNewtypeVariant),
} }
@@ -529,12 +523,10 @@ enum RenameEnumSerializeDeserialize<A> {
fn test_rename_enum() { fn test_rename_enum() {
assert_tokens( assert_tokens(
&RenameEnum::Batman, &RenameEnum::Batman,
&[ &[Token::UnitVariant {
Token::UnitVariant { name: "Superhero",
name: "Superhero", variant: "bruce_wayne",
variant: "bruce_wayne", }],
},
],
); );
assert_tokens( assert_tokens(
@@ -1221,12 +1213,7 @@ fn test_missing_renamed_field_enum() {
#[derive(Debug, PartialEq, Deserialize)] #[derive(Debug, PartialEq, Deserialize)]
enum InvalidLengthEnum { enum InvalidLengthEnum {
A(i32, i32, i32), A(i32, i32, i32),
B( B(#[serde(skip_deserializing)] i32, i32, i32),
#[serde(skip_deserializing)]
i32,
i32,
i32,
),
} }
#[test] #[test]
@@ -1345,7 +1332,7 @@ fn test_flatten_struct_enum() {
let change_request = FlattenStructEnumWrapper { let change_request = FlattenStructEnumWrapper {
data: FlattenStructEnum::InsertInteger { data: FlattenStructEnum::InsertInteger {
index: 0, index: 0,
value: 42 value: 42,
}, },
extra, extra,
}; };
@@ -1362,7 +1349,7 @@ fn test_flatten_struct_enum() {
Token::MapEnd, Token::MapEnd,
Token::Str("extra_key"), Token::Str("extra_key"),
Token::Str("extra value"), Token::Str("extra value"),
Token::MapEnd Token::MapEnd,
], ],
); );
assert_ser_tokens( assert_ser_tokens(
@@ -1370,7 +1357,10 @@ fn test_flatten_struct_enum() {
&[ &[
Token::Map { len: None }, Token::Map { len: None },
Token::Str("insert_integer"), Token::Str("insert_integer"),
Token::Struct { len: 2, name: "insert_integer" }, Token::Struct {
len: 2,
name: "insert_integer",
},
Token::Str("index"), Token::Str("index"),
Token::U32(0), Token::U32(0),
Token::Str("value"), Token::Str("value"),
@@ -1378,7 +1368,7 @@ fn test_flatten_struct_enum() {
Token::StructEnd, Token::StructEnd,
Token::Str("extra_key"), Token::Str("extra_key"),
Token::Str("extra value"), Token::Str("extra value"),
Token::MapEnd Token::MapEnd,
], ],
); );
} }
@@ -1387,12 +1377,10 @@ fn test_flatten_struct_enum() {
fn test_flatten_struct_tag_content_enum() { fn test_flatten_struct_tag_content_enum() {
let change_request = FlattenStructTagContentEnumWrapper { let change_request = FlattenStructTagContentEnumWrapper {
outer: 42, outer: 42,
data: FlattenStructTagContentEnumNewtype( data: FlattenStructTagContentEnumNewtype(FlattenStructTagContentEnum::InsertInteger {
FlattenStructTagContentEnum::InsertInteger { index: 0,
index: 0, value: 42,
value: 42 }),
}
),
}; };
assert_de_tokens( assert_de_tokens(
&change_request, &change_request,
@@ -1421,7 +1409,10 @@ fn test_flatten_struct_tag_content_enum() {
Token::Str("type"), Token::Str("type"),
Token::Str("insert_integer"), Token::Str("insert_integer"),
Token::Str("value"), Token::Str("value"),
Token::Struct { len: 2, name: "insert_integer" }, Token::Struct {
len: 2,
name: "insert_integer",
},
Token::Str("index"), Token::Str("index"),
Token::U32(0), Token::U32(0),
Token::Str("value"), Token::Str("value"),
@@ -1436,13 +1427,9 @@ fn test_flatten_struct_tag_content_enum() {
fn test_flatten_struct_tag_content_enum_newtype() { fn test_flatten_struct_tag_content_enum_newtype() {
let change_request = FlattenStructTagContentEnumWrapper { let change_request = FlattenStructTagContentEnumWrapper {
outer: 42, outer: 42,
data: FlattenStructTagContentEnumNewtype( data: FlattenStructTagContentEnumNewtype(FlattenStructTagContentEnum::NewtypeVariant(
FlattenStructTagContentEnum::NewtypeVariant( FlattenStructTagContentEnumNewtypeVariant { value: 23 },
FlattenStructTagContentEnumNewtypeVariant { )),
value: 23
}
)
),
}; };
assert_de_tokens( assert_de_tokens(
&change_request, &change_request,
@@ -1469,7 +1456,10 @@ fn test_flatten_struct_tag_content_enum_newtype() {
Token::Str("type"), Token::Str("type"),
Token::Str("newtype_variant"), Token::Str("newtype_variant"),
Token::Str("value"), Token::Str("value"),
Token::Struct { len: 1, name: "FlattenStructTagContentEnumNewtypeVariant" }, Token::Struct {
len: 1,
name: "FlattenStructTagContentEnumNewtypeVariant",
},
Token::Str("value"), Token::Str("value"),
Token::U32(23), Token::U32(23),
Token::StructEnd, Token::StructEnd,
@@ -1525,7 +1515,7 @@ fn test_complex_flatten() {
first: First, first: First,
#[serde(flatten)] #[serde(flatten)]
second: Second, second: Second,
z: u32 z: u32,
} }
#[derive(Debug, PartialEq, Serialize, Deserialize)] #[derive(Debug, PartialEq, Serialize, Deserialize)]
@@ -1552,10 +1542,8 @@ fn test_complex_flatten() {
d: "c".into(), d: "c".into(),
e: Some(2), e: Some(2),
}, },
second: Second { second: Second { f: 3 },
f: 3 z: 4,
},
z: 4
}, },
&[ &[
Token::Map { len: None }, Token::Map { len: None },
@@ -1592,10 +1580,8 @@ fn test_complex_flatten() {
d: "c".into(), d: "c".into(),
e: Some(2), e: Some(2),
}, },
second: Second { second: Second { f: 3 },
f: 3 z: 4,
},
z: 4
}, },
&[ &[
Token::Map { len: None }, Token::Map { len: None },
@@ -1652,7 +1638,7 @@ fn test_flatten_unsupported_type() {
Token::Str("foo"), Token::Str("foo"),
Token::Str("a"), Token::Str("a"),
Token::Str("b"), Token::Str("b"),
Token::MapEnd Token::MapEnd,
], ],
"can only flatten structs and maps", "can only flatten structs and maps",
); );
@@ -1671,7 +1657,11 @@ fn test_non_string_keys() {
let mut mapping = HashMap::new(); let mut mapping = HashMap::new();
mapping.insert(0, 42); mapping.insert(0, 42);
assert_tokens( assert_tokens(
&TestStruct { name: "peter".into(), age: 3, mapping }, &TestStruct {
name: "peter".into(),
age: 3,
mapping,
},
&[ &[
Token::Map { len: None }, Token::Map { len: None },
Token::Str("name"), Token::Str("name"),
@@ -1720,7 +1710,9 @@ fn test_lifetime_propagation_for_flatten() {
let mut borrowed_map = HashMap::new(); let mut borrowed_map = HashMap::new();
borrowed_map.insert("x", 42u32); borrowed_map.insert("x", 42u32);
assert_ser_tokens( assert_ser_tokens(
&B { t: borrowed_map.clone() }, &B {
t: borrowed_map.clone(),
},
&[ &[
Token::Map { len: None }, Token::Map { len: None },
Token::BorrowedStr("x"), Token::BorrowedStr("x"),
@@ -1742,7 +1734,9 @@ fn test_lifetime_propagation_for_flatten() {
let mut borrowed_map = HashMap::new(); let mut borrowed_map = HashMap::new();
borrowed_map.insert(&b"x"[..], 42u32); borrowed_map.insert(&b"x"[..], 42u32);
assert_ser_tokens( assert_ser_tokens(
&C { t: borrowed_map.clone() }, &C {
t: borrowed_map.clone(),
},
&[ &[
Token::Map { len: None }, Token::Map { len: None },
Token::Seq { len: Some(1) }, Token::Seq { len: Some(1) },
+4 -4
View File
@@ -12,14 +12,14 @@
extern crate serde_derive; extern crate serde_derive;
use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};
use std::net;
use std::path::{Path, PathBuf};
use std::time::{Duration, UNIX_EPOCH};
use std::default::Default; use std::default::Default;
use std::ffi::{CString, OsString}; use std::ffi::{CString, OsString};
use std::net;
use std::num::Wrapping;
use std::path::{Path, PathBuf};
use std::rc::Rc; use std::rc::Rc;
use std::sync::Arc; use std::sync::Arc;
use std::num::Wrapping; use std::time::{Duration, UNIX_EPOCH};
#[cfg(feature = "unstable")] #[cfg(feature = "unstable")]
use std::ffi::CStr; use std::ffi::CStr;
+40 -42
View File
@@ -17,8 +17,8 @@
extern crate serde_derive; extern crate serde_derive;
extern crate serde; extern crate serde;
use self::serde::ser::{Serialize, Serializer};
use self::serde::de::{DeserializeOwned, Deserializer}; use self::serde::de::{DeserializeOwned, Deserializer};
use self::serde::ser::{Serialize, Serializer};
use std::borrow::Cow; use std::borrow::Cow;
use std::marker::PhantomData; use std::marker::PhantomData;
@@ -92,14 +92,10 @@ fn test_gen() {
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
enum EnumWith<T> { enum EnumWith<T> {
Unit, Unit,
Newtype( Newtype(#[serde(serialize_with = "ser_x", deserialize_with = "de_x")] X),
#[serde(serialize_with = "ser_x", deserialize_with = "de_x")]
X,
),
Tuple( Tuple(
T, T,
#[serde(serialize_with = "ser_x", deserialize_with = "de_x")] #[serde(serialize_with = "ser_x", deserialize_with = "de_x")] X,
X,
), ),
Struct { Struct {
t: T, t: T,
@@ -122,17 +118,13 @@ fn test_gen() {
assert_ser::<MultipleRef<i32>>(); assert_ser::<MultipleRef<i32>>();
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct Newtype( struct Newtype(#[serde(serialize_with = "ser_x", deserialize_with = "de_x")] X);
#[serde(serialize_with = "ser_x", deserialize_with = "de_x")]
X,
);
assert::<Newtype>(); assert::<Newtype>();
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct Tuple<T>( struct Tuple<T>(
T, T,
#[serde(serialize_with = "ser_x", deserialize_with = "de_x")] #[serde(serialize_with = "ser_x", deserialize_with = "de_x")] X,
X,
); );
assert::<Tuple<i32>>(); assert::<Tuple<i32>>();
@@ -191,12 +183,16 @@ fn test_gen() {
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
#[serde(bound = "D: SerializeWith + DeserializeWith")] #[serde(bound = "D: SerializeWith + DeserializeWith")]
struct WithTraits1<D, E> { struct WithTraits1<D, E> {
#[serde(serialize_with = "SerializeWith::serialize_with", #[serde(
deserialize_with = "DeserializeWith::deserialize_with")] serialize_with = "SerializeWith::serialize_with",
deserialize_with = "DeserializeWith::deserialize_with"
)]
d: D, d: D,
#[serde(serialize_with = "SerializeWith::serialize_with", #[serde(
deserialize_with = "DeserializeWith::deserialize_with", serialize_with = "SerializeWith::serialize_with",
bound = "E: SerializeWith + DeserializeWith")] deserialize_with = "DeserializeWith::deserialize_with",
bound = "E: SerializeWith + DeserializeWith"
)]
e: E, e: E,
} }
assert::<WithTraits1<X, X>>(); assert::<WithTraits1<X, X>>();
@@ -204,13 +200,18 @@ fn test_gen() {
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
#[serde(bound(serialize = "D: SerializeWith", deserialize = "D: DeserializeWith"))] #[serde(bound(serialize = "D: SerializeWith", deserialize = "D: DeserializeWith"))]
struct WithTraits2<D, E> { struct WithTraits2<D, E> {
#[serde(serialize_with = "SerializeWith::serialize_with", #[serde(
deserialize_with = "DeserializeWith::deserialize_with")] serialize_with = "SerializeWith::serialize_with",
deserialize_with = "DeserializeWith::deserialize_with"
)]
d: D, d: D,
#[serde(serialize_with = "SerializeWith::serialize_with", #[serde(
bound(serialize = "E: SerializeWith"))] serialize_with = "SerializeWith::serialize_with", bound(serialize = "E: SerializeWith")
#[serde(deserialize_with = "DeserializeWith::deserialize_with", )]
bound(deserialize = "E: DeserializeWith"))] #[serde(
deserialize_with = "DeserializeWith::deserialize_with",
bound(deserialize = "E: DeserializeWith")
)]
e: E, e: E,
} }
assert::<WithTraits2<X, X>>(); assert::<WithTraits2<X, X>>();
@@ -270,17 +271,11 @@ fn test_gen() {
struct EmptyTupleDenyUnknown(); struct EmptyTupleDenyUnknown();
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct TupleSkipAll( struct TupleSkipAll(#[serde(skip_deserializing)] u8);
#[serde(skip_deserializing)]
u8,
);
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
#[serde(deny_unknown_fields)] #[serde(deny_unknown_fields)]
struct TupleSkipAllDenyUnknown( struct TupleSkipAllDenyUnknown(#[serde(skip_deserializing)] u8);
#[serde(skip_deserializing)]
u8,
);
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
enum EmptyEnum {} enum EmptyEnum {}
@@ -305,10 +300,7 @@ fn test_gen() {
#[serde(skip_deserializing)] #[serde(skip_deserializing)]
f: u8, f: u8,
}, },
TupleSkip( TupleSkip(#[serde(skip_deserializing)] u8),
#[serde(skip_deserializing)]
u8,
),
} }
#[cfg(feature = "unstable")] #[cfg(feature = "unstable")]
@@ -321,10 +313,7 @@ fn test_gen() {
#[serde(skip_deserializing)] #[serde(skip_deserializing)]
f: u8, f: u8,
}, },
TupleSkip( TupleSkip(#[serde(skip_deserializing)] u8),
#[serde(skip_deserializing)]
u8,
),
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
@@ -503,6 +492,13 @@ fn test_gen() {
} }
assert_ser::<UntaggedVariantWith>(); assert_ser::<UntaggedVariantWith>();
#[derive(Serialize, Deserialize)]
struct FlattenWith {
#[serde(flatten, serialize_with = "ser_x", deserialize_with = "de_x")]
x: X,
}
assert::<FlattenWith>();
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct StaticStrStruct<'a> { struct StaticStrStruct<'a> {
a: &'a str, a: &'a str,
@@ -531,7 +527,9 @@ fn test_gen() {
assert::<SkippedStaticStr>(); assert::<SkippedStaticStr>();
macro_rules! T { macro_rules! T {
() => { () } () => {
()
};
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
@@ -559,7 +557,7 @@ fn test_gen() {
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct AssocDerive<T: AssocSerde> { struct AssocDerive<T: AssocSerde> {
assoc: T::Assoc assoc: T::Assoc,
} }
assert::<AssocDerive<NoSerdeImpl>>(); assert::<AssocDerive<NoSerdeImpl>>();
+85 -33
View File
@@ -7,7 +7,6 @@
// except according to those terms. // except according to those terms.
#![deny(trivial_numeric_casts)] #![deny(trivial_numeric_casts)]
#![cfg_attr(feature = "cargo-clippy", allow(redundant_field_names))] #![cfg_attr(feature = "cargo-clippy", allow(redundant_field_names))]
#[macro_use] #[macro_use]
@@ -226,12 +225,10 @@ fn test_de_named_map() {
fn test_ser_enum_unit() { fn test_ser_enum_unit() {
assert_ser_tokens( assert_ser_tokens(
&SerEnum::Unit::<u32, u32, u32>, &SerEnum::Unit::<u32, u32, u32>,
&[ &[Token::UnitVariant {
Token::UnitVariant { name: "SerEnum",
name: "SerEnum", variant: "Unit",
variant: "Unit", }],
},
],
); );
} }
@@ -296,12 +293,10 @@ fn test_ser_enum_map() {
fn test_de_enum_unit() { fn test_de_enum_unit() {
assert_tokens( assert_tokens(
&DeEnum::Unit::<u32, u32, u32>, &DeEnum::Unit::<u32, u32, u32>,
&[ &[Token::UnitVariant {
Token::UnitVariant { name: "DeEnum",
name: "DeEnum", variant: "Unit",
variant: "Unit", }],
},
],
); );
} }
@@ -446,6 +441,51 @@ fn test_generic_newtype_struct() {
); );
} }
#[test]
fn test_untagged_newtype_struct() {
#[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
enum E {
Newtype(GenericNewTypeStruct<u32>),
Null,
}
assert_tokens(
&E::Newtype(GenericNewTypeStruct(5u32)),
&[
Token::NewtypeStruct {
name: "GenericNewTypeStruct",
},
Token::U32(5),
],
);
}
#[test]
fn test_adjacently_tagged_newtype_struct() {
#[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(tag = "t", content = "c")]
enum E {
Newtype(GenericNewTypeStruct<u32>),
Null,
}
assert_de_tokens(
&E::Newtype(GenericNewTypeStruct(5u32)),
&[
Token::Struct { name: "E", len: 2 },
Token::Str("c"),
Token::NewtypeStruct {
name: "GenericNewTypeStruct",
},
Token::U32(5),
Token::Str("t"),
Token::Str("Newtype"),
Token::StructEnd,
],
);
}
#[test] #[test]
fn test_generic_tuple_struct() { fn test_generic_tuple_struct() {
assert_tokens( assert_tokens(
@@ -466,12 +506,10 @@ fn test_generic_tuple_struct() {
fn test_generic_enum_unit() { fn test_generic_enum_unit() {
assert_tokens( assert_tokens(
&GenericEnum::Unit::<u32, u32>, &GenericEnum::Unit::<u32, u32>,
&[ &[Token::UnitVariant {
Token::UnitVariant { name: "GenericEnum",
name: "GenericEnum", variant: "Unit",
variant: "Unit", }],
},
],
); );
} }
@@ -798,7 +836,9 @@ fn test_internally_tagged_bytes() {
} }
assert_de_tokens( assert_de_tokens(
&InternallyTagged::String { string: "\0".to_owned() }, &InternallyTagged::String {
string: "\0".to_owned(),
},
&[ &[
Token::Struct { Token::Struct {
name: "String", name: "String",
@@ -813,7 +853,9 @@ fn test_internally_tagged_bytes() {
); );
assert_de_tokens( assert_de_tokens(
&InternallyTagged::String { string: "\0".to_owned() }, &InternallyTagged::String {
string: "\0".to_owned(),
},
&[ &[
Token::Struct { Token::Struct {
name: "String", name: "String",
@@ -828,7 +870,9 @@ fn test_internally_tagged_bytes() {
); );
assert_de_tokens( assert_de_tokens(
&InternallyTagged::String { string: "\0".to_owned() }, &InternallyTagged::String {
string: "\0".to_owned(),
},
&[ &[
Token::Struct { Token::Struct {
name: "String", name: "String",
@@ -843,7 +887,9 @@ fn test_internally_tagged_bytes() {
); );
assert_de_tokens( assert_de_tokens(
&InternallyTagged::String { string: "\0".to_owned() }, &InternallyTagged::String {
string: "\0".to_owned(),
},
&[ &[
Token::Struct { Token::Struct {
name: "String", name: "String",
@@ -1354,12 +1400,10 @@ fn test_enum_in_untagged_enum() {
assert_tokens( assert_tokens(
&Outer::Inner(Inner::Unit), &Outer::Inner(Inner::Unit),
&[ &[Token::UnitVariant {
Token::UnitVariant { name: "Inner",
name: "Inner", variant: "Unit",
variant: "Unit", }],
},
],
); );
assert_tokens( assert_tokens(
@@ -1417,7 +1461,9 @@ fn test_untagged_bytes() {
} }
assert_de_tokens( assert_de_tokens(
&Untagged::String { string: "\0".to_owned() }, &Untagged::String {
string: "\0".to_owned(),
},
&[ &[
Token::Struct { Token::Struct {
name: "Untagged", name: "Untagged",
@@ -1430,7 +1476,9 @@ fn test_untagged_bytes() {
); );
assert_de_tokens( assert_de_tokens(
&Untagged::String { string: "\0".to_owned() }, &Untagged::String {
string: "\0".to_owned(),
},
&[ &[
Token::Struct { Token::Struct {
name: "Untagged", name: "Untagged",
@@ -1443,7 +1491,9 @@ fn test_untagged_bytes() {
); );
assert_de_tokens( assert_de_tokens(
&Untagged::String { string: "\0".to_owned() }, &Untagged::String {
string: "\0".to_owned(),
},
&[ &[
Token::Struct { Token::Struct {
name: "Untagged", name: "Untagged",
@@ -1456,7 +1506,9 @@ fn test_untagged_bytes() {
); );
assert_de_tokens( assert_de_tokens(
&Untagged::String { string: "\0".to_owned() }, &Untagged::String {
string: "\0".to_owned(),
},
&[ &[
Token::Struct { Token::Struct {
name: "Untagged", name: "Untagged",
+6 -21
View File
@@ -121,10 +121,7 @@ struct UnitDef;
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
#[serde(remote = "remote::PrimitivePriv")] #[serde(remote = "remote::PrimitivePriv")]
struct PrimitivePrivDef( struct PrimitivePrivDef(#[serde(getter = "remote::PrimitivePriv::get")] u8);
#[serde(getter = "remote::PrimitivePriv::get")]
u8,
);
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
#[serde(remote = "remote::PrimitivePub")] #[serde(remote = "remote::PrimitivePub")]
@@ -132,34 +129,22 @@ struct PrimitivePubDef(u8);
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
#[serde(remote = "remote::NewtypePriv")] #[serde(remote = "remote::NewtypePriv")]
struct NewtypePrivDef( struct NewtypePrivDef(#[serde(getter = "remote::NewtypePriv::get", with = "UnitDef")] remote::Unit);
#[serde(getter = "remote::NewtypePriv::get", with = "UnitDef")]
remote::Unit,
);
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
#[serde(remote = "remote::NewtypePub")] #[serde(remote = "remote::NewtypePub")]
struct NewtypePubDef( struct NewtypePubDef(#[serde(with = "UnitDef")] remote::Unit);
#[serde(with = "UnitDef")]
remote::Unit,
);
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
#[serde(remote = "remote::TuplePriv")] #[serde(remote = "remote::TuplePriv")]
struct TuplePrivDef( struct TuplePrivDef(
#[serde(getter = "remote::TuplePriv::first")] #[serde(getter = "remote::TuplePriv::first")] u8,
u8, #[serde(getter = "remote::TuplePriv::second", with = "UnitDef")] remote::Unit,
#[serde(getter = "remote::TuplePriv::second", with = "UnitDef")]
remote::Unit,
); );
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
#[serde(remote = "remote::TuplePub")] #[serde(remote = "remote::TuplePub")]
struct TuplePubDef( struct TuplePubDef(u8, #[serde(with = "UnitDef")] remote::Unit);
u8,
#[serde(with = "UnitDef")]
remote::Unit,
);
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
#[serde(remote = "remote::StructPriv")] #[serde(remote = "remote::StructPriv")]
+4 -4
View File
@@ -10,13 +10,13 @@
extern crate serde_derive; extern crate serde_derive;
use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};
use std::net;
use std::path::{Path, PathBuf};
use std::time::{Duration, UNIX_EPOCH};
use std::ffi::CString; use std::ffi::CString;
use std::net;
use std::num::Wrapping;
use std::path::{Path, PathBuf};
use std::rc::Rc; use std::rc::Rc;
use std::sync::Arc; use std::sync::Arc;
use std::num::Wrapping; use std::time::{Duration, UNIX_EPOCH};
#[cfg(unix)] #[cfg(unix)]
use std::str; use std::str;
+1 -1
View File
@@ -10,8 +10,8 @@
extern crate serde_derive; extern crate serde_derive;
extern crate serde; extern crate serde;
use serde::Deserialize;
use serde::de::{value, IntoDeserializer}; use serde::de::{value, IntoDeserializer};
use serde::Deserialize;
#[test] #[test]
fn test_u32_to_enum() { fn test_u32_to_enum() {