Make custom serializer be called only once (#25)

This commit is contained in:
Dmitry Samoylov 2020-01-15 18:23:29 +07:00
parent 4b5a28f80e
commit 7d8923a785
2 changed files with 38 additions and 91 deletions

View File

@ -77,35 +77,22 @@ pub fn serialize(
} }
}), }),
Some(FieldType::FieldTypeStruct { .. }) => Some(quote! { Some(FieldType::FieldTypeStruct { .. }) => Some(quote! {
let struct_start_event = XmlEvent::start_element(#field_label_name);
let _ret = writer.write(struct_start_event);
match self { match self {
&#name::#label{ref #field_label, ..} => { &#name::#label{ref #field_label, ..} => {
writer.set_skip_start_end(true); writer.set_start_event_name(Some(#field_label_name.to_string()));
if let Err(msg) = #field_label.serialize(writer) { writer.set_skip_start_end(false);
return Err(msg); #field_label.serialize(writer)?;
};
}, },
_ => {} _ => {}
} }
let struct_end_event = XmlEvent::end_element();
let _ret = writer.write(struct_end_event);
}), }),
Some(FieldType::FieldTypeVec { .. }) => Some(quote! { Some(FieldType::FieldTypeVec { .. }) => Some(quote! {
match self { match self {
&#name::#label{ref #field_label, ..} => { &#name::#label{ref #field_label, ..} => {
for item in #field_label { for item in #field_label {
let struct_start_event = XmlEvent::start_element(#field_label_name); writer.set_start_event_name(Some(#field_label_name.to_string()));
let _ret = writer.write(struct_start_event); writer.set_skip_start_end(false);
item.serialize(writer)?;
writer.set_skip_start_end(true);
if let Err(msg) = item.serialize(writer) {
return Err(msg);
};
let struct_end_event = XmlEvent::end_element();
let _ret = writer.write(struct_end_event);
} }
}, },
_ => {} _ => {}
@ -163,10 +150,9 @@ pub fn serialize(
}); });
let serialize = quote! { let serialize = quote! {
writer.set_start_event_name(None);
writer.set_skip_start_end(true); writer.set_skip_start_end(true);
if let Err(msg) = item.serialize(writer) { item.serialize(writer)?;
return Err(msg);
};
}; };
let write_sub_type = |data_type| { let write_sub_type = |data_type| {
@ -255,27 +241,27 @@ pub fn serialize(
#[allow(unused_variables)] #[allow(unused_variables)]
fn serialize<W: Write>(&self, writer: &mut yaserde::ser::Serializer<W>) fn serialize<W: Write>(&self, writer: &mut yaserde::ser::Serializer<W>)
-> Result<(), String> { -> Result<(), String> {
let skip = writer.skip_start_end();
if !skip {
if let Some(label) = writer.get_start_event_name() { if let Some(label) = writer.get_start_event_name() {
let struct_start_event = XmlEvent::start_element(label.as_ref()); let struct_start_event = XmlEvent::start_element(label.as_ref());
let _ret = writer.write(struct_start_event); let _ret = writer.write(struct_start_event);
return Ok(()); } else {
}
error!("Enum: start to expand {:?}", #root);
if !writer.skip_start_end() {
let struct_start_event = XmlEvent::start_element(#root)#add_namespaces; let struct_start_event = XmlEvent::start_element(#root)#add_namespaces;
let _ret = writer.write(struct_start_event); let _ret = writer.write(struct_start_event);
} }
}
match self { match self {
#write_enum_content #write_enum_content
} }
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);
} }
writer.set_skip_start_end(false);
Ok(()) Ok(())
} }
} }

View File

@ -361,24 +361,8 @@ pub fn serialize(
Some(&FieldType::FieldTypeStruct { .. }) => Some(quote! { Some(&FieldType::FieldTypeStruct { .. }) => Some(quote! {
if let Some(ref item) = &self.#label { if let Some(ref item) = &self.#label {
writer.set_start_event_name(Some(#label_name.to_string())); writer.set_start_event_name(Some(#label_name.to_string()));
match item.serialize(writer) { writer.set_skip_start_end(false);
Ok(()) => {}, item.serialize(writer)?;
Err(msg) => {
return Err(msg);
},
};
writer.set_start_event_name(None);
writer.set_skip_start_end(true);
match item.serialize(writer) {
Ok(()) => {},
Err(msg) => {
return Err(msg);
},
};
let end_event = XmlEvent::end_element();
let _ret = writer.write(end_event);
} }
}), }),
_ => unimplemented!(), _ => unimplemented!(),
@ -386,24 +370,8 @@ pub fn serialize(
} }
Some(FieldType::FieldTypeStruct { .. }) => Some(quote! { Some(FieldType::FieldTypeStruct { .. }) => Some(quote! {
writer.set_start_event_name(Some(#label_name.to_string())); writer.set_start_event_name(Some(#label_name.to_string()));
match self.#label.serialize(writer) { writer.set_skip_start_end(false);
Ok(()) => {}, self.#label.serialize(writer)?;
Err(msg) => {
return Err(msg);
},
};
writer.set_start_event_name(None);
writer.set_skip_start_end(true);
match self.#label.serialize(writer) {
Ok(()) => {},
Err(msg) => {
return Err(msg);
},
};
let end_event = XmlEvent::end_element();
let _ret = writer.write(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);
@ -441,25 +409,17 @@ pub fn serialize(
Some(&FieldType::FieldTypeOption { .. }) => Some(quote! { Some(&FieldType::FieldTypeOption { .. }) => Some(quote! {
for item in &self.#label { for item in &self.#label {
if let Some(value) = item { if let Some(value) = item {
writer.set_start_event_name(None);
writer.set_skip_start_end(false); writer.set_skip_start_end(false);
match value.serialize(writer) { value.serialize(writer)?;
Ok(()) => {},
Err(msg) => {
return Err(msg);
},
};
} }
} }
}), }),
Some(&FieldType::FieldTypeStruct { .. }) => Some(quote! { Some(&FieldType::FieldTypeStruct { .. }) => Some(quote! {
for item in &self.#label { for item in &self.#label {
writer.set_start_event_name(None);
writer.set_skip_start_end(false); writer.set_skip_start_end(false);
match item.serialize(writer) { item.serialize(writer)?;
Ok(()) => {},
Err(msg) => {
return Err(msg);
},
};
} }
}), }),
Some(&FieldType::FieldTypeVec { .. }) => { Some(&FieldType::FieldTypeVec { .. }) => {
@ -487,19 +447,19 @@ pub fn serialize(
#[allow(unused_variables)] #[allow(unused_variables)]
fn serialize<W: Write>(&self, writer: &mut yaserde::ser::Serializer<W>) fn serialize<W: Write>(&self, writer: &mut yaserde::ser::Serializer<W>)
-> Result<(), String> { -> Result<(), String> {
let skip = writer.skip_start_end();
if !skip {
if let Some(label) = writer.get_start_event_name() { if let Some(label) = writer.get_start_event_name() {
let struct_start_event = XmlEvent::start_element(label.as_ref()); let struct_start_event = XmlEvent::start_element(label.as_ref());
#build_attributes #build_attributes
let _ret = writer.write(struct_start_event); let _ret = writer.write(struct_start_event);
return Ok(()) } else {
}
error!("Struct: start to expand {:?}", #root);
let skip = writer.skip_start_end();
if !skip {
let struct_start_event = XmlEvent::start_element(#root)#add_namespaces; let struct_start_event = XmlEvent::start_element(#root)#add_namespaces;
#build_attributes #build_attributes
let _ret = writer.write(struct_start_event); let _ret = writer.write(struct_start_event);
} }
}
#struct_inspector #struct_inspector
@ -507,6 +467,7 @@ pub fn serialize(
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);
} }
Ok(()) Ok(())
} }
} }