mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-04-27 00:47:54 +00:00
Merge pull request #1448 from motu42/master
Allow #[serde(tag="...")] on structs
This commit is contained in:
+18
-6
@@ -294,11 +294,23 @@ fn serialize_struct_as_struct(
|
||||
fields: &[Field],
|
||||
cattrs: &attr::Container,
|
||||
) -> Fragment {
|
||||
let serialize_fields =
|
||||
let mut serialize_fields =
|
||||
serialize_struct_visitor(fields, params, false, &StructTrait::SerializeStruct);
|
||||
|
||||
let type_name = cattrs.name().serialize_name();
|
||||
|
||||
let additional_field_count: usize = match cattrs.tag() {
|
||||
&attr::TagType::Internal{ref tag} => {
|
||||
let func = StructTrait::SerializeStruct.serialize_field(Span::call_site());
|
||||
serialize_fields.insert(0, quote! {
|
||||
try!(#func(&mut __serde_state, #tag, #type_name));
|
||||
});
|
||||
|
||||
1
|
||||
}
|
||||
_ => 0
|
||||
};
|
||||
|
||||
let mut serialized_fields = fields
|
||||
.iter()
|
||||
.filter(|&field| !field.attrs.skip_serializing())
|
||||
@@ -314,7 +326,7 @@ fn serialize_struct_as_struct(
|
||||
quote!(if #path(#field_expr) { 0 } else { 1 })
|
||||
}
|
||||
})
|
||||
.fold(quote!(0), |sum, expr| quote!(#sum + #expr));
|
||||
.fold(quote!(#additional_field_count), |sum, expr| quote!(#sum + #expr));
|
||||
|
||||
quote_block! {
|
||||
let #let_mut __serde_state = try!(_serde::Serializer::serialize_struct(__serializer, #type_name, #len));
|
||||
@@ -435,17 +447,17 @@ fn serialize_variant(
|
||||
};
|
||||
|
||||
let body = Match(match *cattrs.tag() {
|
||||
attr::EnumTag::External => {
|
||||
attr::TagType::External => {
|
||||
serialize_externally_tagged_variant(params, variant, variant_index, cattrs)
|
||||
}
|
||||
attr::EnumTag::Internal { ref tag } => {
|
||||
attr::TagType::Internal { ref tag } => {
|
||||
serialize_internally_tagged_variant(params, variant, cattrs, tag)
|
||||
}
|
||||
attr::EnumTag::Adjacent {
|
||||
attr::TagType::Adjacent {
|
||||
ref tag,
|
||||
ref content,
|
||||
} => serialize_adjacently_tagged_variant(params, variant, cattrs, tag, content),
|
||||
attr::EnumTag::None => serialize_untagged_variant(params, variant, cattrs),
|
||||
attr::TagType::None => serialize_untagged_variant(params, variant, cattrs),
|
||||
});
|
||||
|
||||
quote! {
|
||||
|
||||
Reference in New Issue
Block a user