fix serialization for vec and structs

This commit is contained in:
Marc-Antoine Arnaud 2018-05-15 20:02:37 +02:00
parent 1880f4d997
commit 7a6ae6e6fe

View File

@ -100,21 +100,29 @@ pub fn serialize(data_struct: &DataStruct, name: &Ident, root: &String, namespac
Some(FieldType::FieldTypeString) => Some(FieldType::FieldTypeString) =>
Some(quote!{ Some(quote!{
let start_event = XmlEvent::start_element(#label_name); let start_event = XmlEvent::start_element(#label_name);
let data_event = XmlEvent::characters(&self.#label);
let end_event = XmlEvent::end_element();
let _ret = writer.write(start_event); let _ret = writer.write(start_event);
let data_event = XmlEvent::characters(&self.#label);
let _ret = writer.write(data_event); let _ret = writer.write(data_event);
let end_event = XmlEvent::end_element();
let _ret = writer.write(end_event); let _ret = writer.write(end_event);
}), }),
Some(FieldType::FieldTypeStruct{..}) => Some(FieldType::FieldTypeStruct{..}) =>
Some(quote!{ Some(quote!{
writer.set_skip_start_end(false); let start_event = XmlEvent::start_element(#label_name);
let _ret = writer.write(start_event);
writer.set_skip_start_end(true);
match self.#label.serialize(writer) { match self.#label.serialize(writer) {
Ok(()) => {}, Ok(()) => {},
Err(msg) => { Err(msg) => {
return Err(msg); return Err(msg);
}, },
}; };
let struct_end_event = XmlEvent::end_element();
let _ret = writer.write(struct_end_event);
}), }),
Some(FieldType::FieldTypeVec{data_type}) => { Some(FieldType::FieldTypeVec{data_type}) => {
let dt = Box::into_raw(data_type); let dt = Box::into_raw(data_type);
@ -135,6 +143,10 @@ pub fn serialize(data_struct: &DataStruct, name: &Ident, root: &String, namespac
}, },
Some(&FieldType::FieldTypeStruct{..}) => { Some(&FieldType::FieldTypeStruct{..}) => {
Some(quote!{ Some(quote!{
let start_event = XmlEvent::start_element(#label_name);
let _ret = writer.write(start_event);
for item in &self.#label { for item in &self.#label {
writer.set_skip_start_end(false); writer.set_skip_start_end(false);
match item.serialize(writer) { match item.serialize(writer) {
@ -144,6 +156,8 @@ pub fn serialize(data_struct: &DataStruct, name: &Ident, root: &String, namespac
}, },
}; };
} }
let end_event = XmlEvent::end_element();
let _ret = writer.write(end_event);
}) })
}, },
Some(&FieldType::FieldTypeVec{..}) => {unimplemented!();}, Some(&FieldType::FieldTypeVec{..}) => {unimplemented!();},
@ -164,15 +178,15 @@ pub fn serialize(data_struct: &DataStruct, name: &Ident, root: &String, namespac
#[allow(unused_variables)] #[allow(unused_variables)]
fn serialize<W: Write>(&self, writer: &mut yaserde::ser::Serializer<W>) -> Result<(), String> { fn serialize<W: Write>(&self, writer: &mut yaserde::ser::Serializer<W>) -> Result<(), String> {
error!("Struct: start to expand {:?}", #root); error!("Struct: start to expand {:?}", #root);
let skip = writer.skip_start_end();
if !writer.skip_start_end() { if !skip {
let struct_start_event = XmlEvent::start_element(#root)#build_attributes#add_namespaces; let struct_start_event = XmlEvent::start_element(#root)#build_attributes#add_namespaces;
let _ret = writer.write(struct_start_event); let _ret = writer.write(struct_start_event);
} }
#struct_inspector #struct_inspector
if !writer.skip_start_end() { if !skip {
let struct_end_event = XmlEvent::end_element(); let struct_end_event = XmlEvent::end_element();
let _ret = writer.write(struct_end_event); let _ret = writer.write(struct_end_event);
} }