mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-04-29 22:17:55 +00:00
Merge pull request #1622 from Xaeroxe/fix-new-types
Fix (de)serialization of new types where the internal type is skipped
This commit is contained in:
@@ -1689,6 +1689,24 @@ fn deserialize_externally_tagged_variant(
|
||||
}
|
||||
}
|
||||
Style::Newtype => {
|
||||
if variant.fields[0].attrs.skip_deserializing() {
|
||||
let this = ¶ms.this;
|
||||
let let_default = match variant.fields[0].attrs.default() {
|
||||
attr::Default::Default => quote!(
|
||||
_serde::export::Default::default()
|
||||
),
|
||||
attr::Default::Path(ref path) => quote!(
|
||||
#path()
|
||||
),
|
||||
attr::Default::None => unimplemented!(),
|
||||
};
|
||||
|
||||
|
||||
return quote_block! {
|
||||
try!(_serde::de::VariantAccess::unit_variant(__variant));
|
||||
_serde::export::Ok(#this::#variant_ident(#let_default))
|
||||
};
|
||||
}
|
||||
deserialize_externally_tagged_newtype_variant(variant_ident, params, &variant.fields[0])
|
||||
}
|
||||
Style::Tuple => {
|
||||
@@ -1839,6 +1857,21 @@ fn deserialize_untagged_newtype_variant(
|
||||
let field_ty = field.ty;
|
||||
match field.attrs.deserialize_with() {
|
||||
None => {
|
||||
if field.attrs.skip_deserializing() {
|
||||
let let_default = match field.attrs.default() {
|
||||
attr::Default::Default => quote!(
|
||||
_serde::export::Default::default()
|
||||
),
|
||||
attr::Default::Path(ref path) => quote!(
|
||||
#path()
|
||||
),
|
||||
attr::Default::None => unimplemented!(),
|
||||
};
|
||||
|
||||
return quote_expr! {
|
||||
_serde::export::Ok(#this::#variant_ident(#let_default))
|
||||
};
|
||||
}
|
||||
let span = field.original.span();
|
||||
let func = quote_spanned!(span=> <#field_ty as _serde::Deserialize>::deserialize);
|
||||
quote_expr! {
|
||||
|
||||
@@ -522,6 +522,16 @@ fn serialize_externally_tagged_variant(
|
||||
}
|
||||
Style::Newtype => {
|
||||
let field = &variant.fields[0];
|
||||
if field.attrs.skip_serializing() {
|
||||
return quote_expr! {
|
||||
_serde::Serializer::serialize_unit_variant(
|
||||
__serializer,
|
||||
#type_name,
|
||||
#variant_index,
|
||||
#variant_name,
|
||||
)
|
||||
}
|
||||
}
|
||||
let mut field_expr = quote!(__field0);
|
||||
if let Some(path) = field.attrs.serialize_with() {
|
||||
field_expr = wrap_serialize_field_with(params, field.ty, path, &field_expr);
|
||||
@@ -598,6 +608,15 @@ fn serialize_internally_tagged_variant(
|
||||
}
|
||||
Style::Newtype => {
|
||||
let field = &variant.fields[0];
|
||||
if field.attrs.skip_serializing() {
|
||||
return quote_block! {
|
||||
let mut __struct = try!(_serde::Serializer::serialize_struct(
|
||||
__serializer, #type_name, 1));
|
||||
try!(_serde::ser::SerializeStruct::serialize_field(
|
||||
&mut __struct, #tag, #variant_name));
|
||||
_serde::ser::SerializeStruct::end(__struct)
|
||||
};
|
||||
}
|
||||
let mut field_expr = quote!(__field0);
|
||||
if let Some(path) = field.attrs.serialize_with() {
|
||||
field_expr = wrap_serialize_field_with(params, field.ty, path, &field_expr);
|
||||
@@ -658,6 +677,15 @@ fn serialize_adjacently_tagged_variant(
|
||||
}
|
||||
Style::Newtype => {
|
||||
let field = &variant.fields[0];
|
||||
if field.attrs.skip_serializing() {
|
||||
return quote_block! {
|
||||
let mut __struct = try!(_serde::Serializer::serialize_struct(
|
||||
__serializer, #type_name, 1));
|
||||
try!(_serde::ser::SerializeStruct::serialize_field(
|
||||
&mut __struct, #tag, #variant_name));
|
||||
_serde::ser::SerializeStruct::end(__struct)
|
||||
};
|
||||
}
|
||||
let mut field_expr = quote!(__field0);
|
||||
if let Some(path) = field.attrs.serialize_with() {
|
||||
field_expr = wrap_serialize_field_with(params, field.ty, path, &field_expr);
|
||||
@@ -761,6 +789,11 @@ fn serialize_untagged_variant(
|
||||
}
|
||||
Style::Newtype => {
|
||||
let field = &variant.fields[0];
|
||||
if field.attrs.skip_serializing() {
|
||||
return quote_expr! {
|
||||
_serde::Serializer::serialize_unit(__serializer)
|
||||
};
|
||||
}
|
||||
let mut field_expr = quote!(__field0);
|
||||
if let Some(path) = field.attrs.serialize_with() {
|
||||
field_expr = wrap_serialize_field_with(params, field.ty, path, &field_expr);
|
||||
|
||||
Reference in New Issue
Block a user