Skip to content

Commit

Permalink
Added unsafe implementation of collected unknown field serialization
Browse files Browse the repository at this point in the history
  • Loading branch information
mitsuhiko committed Mar 14, 2018
1 parent 39f7e73 commit dcd7589
Showing 1 changed file with 17 additions and 0 deletions.
17 changes: 17 additions & 0 deletions serde_derive/src/ser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,22 @@ fn serialize_struct(params: &Parameters, fields: &[Field], cattrs: &attr::Contai
.filter(|&field| !field.attrs.skip_serializing())
.peekable();

let collect_field = fields
.iter()
.filter(|&field| field.attrs.is_collect_field())
.next()
.map(|field| {
let ident = &field.ident;
quote! {
for (ref __key, ref __value) in self.#ident.iter() {
try!(_serde::ser::SerializeStruct::serialize_field(
&mut __serde_state,
unsafe { ::std::mem::transmute(__key.as_str()) },
__value));
}
}
});

let let_mut = mut_if(serialized_fields.peek().is_some());

let len = serialized_fields
Expand All @@ -275,6 +291,7 @@ fn serialize_struct(params: &Parameters, fields: &[Field], cattrs: &attr::Contai
quote_block! {
let #let_mut __serde_state = try!(_serde::Serializer::serialize_struct(__serializer, #type_name, #len));
#(#serialize_fields)*
#collect_field
_serde::ser::SerializeStruct::end(__serde_state)
}
}
Expand Down

0 comments on commit dcd7589

Please sign in to comment.