From 7d8923a785e221b2fb4c0198705325257b0157ef Mon Sep 17 00:00:00 2001 From: Dmitry Samoylov Date: Wed, 15 Jan 2020 18:23:29 +0700 Subject: [PATCH] Make custom serializer be called only once (#25) --- yaserde_derive/src/ser/expand_enum.rs | 52 ++++++----------- yaserde_derive/src/ser/expand_struct.rs | 77 ++++++------------------- 2 files changed, 38 insertions(+), 91 deletions(-) diff --git a/yaserde_derive/src/ser/expand_enum.rs b/yaserde_derive/src/ser/expand_enum.rs index 70ce614..c1eedc6 100644 --- a/yaserde_derive/src/ser/expand_enum.rs +++ b/yaserde_derive/src/ser/expand_enum.rs @@ -77,35 +77,22 @@ pub fn serialize( } }), Some(FieldType::FieldTypeStruct { .. }) => Some(quote! { - let struct_start_event = XmlEvent::start_element(#field_label_name); - let _ret = writer.write(struct_start_event); - match self { &#name::#label{ref #field_label, ..} => { - writer.set_skip_start_end(true); - if let Err(msg) = #field_label.serialize(writer) { - return Err(msg); - }; + writer.set_start_event_name(Some(#field_label_name.to_string())); + writer.set_skip_start_end(false); + #field_label.serialize(writer)?; }, _ => {} } - - let struct_end_event = XmlEvent::end_element(); - let _ret = writer.write(struct_end_event); }), Some(FieldType::FieldTypeVec { .. }) => Some(quote! { match self { &#name::#label{ref #field_label, ..} => { for item in #field_label { - let struct_start_event = XmlEvent::start_element(#field_label_name); - let _ret = writer.write(struct_start_event); - - 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); + writer.set_start_event_name(Some(#field_label_name.to_string())); + writer.set_skip_start_end(false); + item.serialize(writer)?; } }, _ => {} @@ -163,10 +150,9 @@ pub fn serialize( }); let serialize = quote! { + writer.set_start_event_name(None); writer.set_skip_start_end(true); - if let Err(msg) = item.serialize(writer) { - return Err(msg); - }; + item.serialize(writer)?; }; let write_sub_type = |data_type| { @@ -255,27 +241,27 @@ pub fn serialize( #[allow(unused_variables)] fn serialize(&self, writer: &mut yaserde::ser::Serializer) -> Result<(), String> { - if let Some(label) = writer.get_start_event_name() { - let struct_start_event = XmlEvent::start_element(label.as_ref()); - let _ret = writer.write(struct_start_event); - return Ok(()); - } - error!("Enum: start to expand {:?}", #root); + let skip = writer.skip_start_end(); - if !writer.skip_start_end() { - let struct_start_event = XmlEvent::start_element(#root)#add_namespaces; - let _ret = writer.write(struct_start_event); + if !skip { + if let Some(label) = writer.get_start_event_name() { + let struct_start_event = XmlEvent::start_element(label.as_ref()); + let _ret = writer.write(struct_start_event); + } else { + let struct_start_event = XmlEvent::start_element(#root)#add_namespaces; + let _ret = writer.write(struct_start_event); + } } match self { #write_enum_content } - if !writer.skip_start_end() { + if !skip { let struct_end_event = XmlEvent::end_element(); let _ret = writer.write(struct_end_event); } - writer.set_skip_start_end(false); + Ok(()) } } diff --git a/yaserde_derive/src/ser/expand_struct.rs b/yaserde_derive/src/ser/expand_struct.rs index 36f3320..4751439 100644 --- a/yaserde_derive/src/ser/expand_struct.rs +++ b/yaserde_derive/src/ser/expand_struct.rs @@ -361,24 +361,8 @@ pub fn serialize( Some(&FieldType::FieldTypeStruct { .. }) => Some(quote! { if let Some(ref item) = &self.#label { writer.set_start_event_name(Some(#label_name.to_string())); - match item.serialize(writer) { - Ok(()) => {}, - 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); + writer.set_skip_start_end(false); + item.serialize(writer)?; } }), _ => unimplemented!(), @@ -386,24 +370,8 @@ pub fn serialize( } Some(FieldType::FieldTypeStruct { .. }) => Some(quote! { writer.set_start_event_name(Some(#label_name.to_string())); - match self.#label.serialize(writer) { - Ok(()) => {}, - 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); + writer.set_skip_start_end(false); + self.#label.serialize(writer)?; }), Some(FieldType::FieldTypeVec { data_type }) => { let dt = Box::into_raw(data_type); @@ -441,25 +409,17 @@ pub fn serialize( Some(&FieldType::FieldTypeOption { .. }) => Some(quote! { for item in &self.#label { if let Some(value) = item { + writer.set_start_event_name(None); writer.set_skip_start_end(false); - match value.serialize(writer) { - Ok(()) => {}, - Err(msg) => { - return Err(msg); - }, - }; + value.serialize(writer)?; } } }), Some(&FieldType::FieldTypeStruct { .. }) => Some(quote! { for item in &self.#label { + writer.set_start_event_name(None); writer.set_skip_start_end(false); - match item.serialize(writer) { - Ok(()) => {}, - Err(msg) => { - return Err(msg); - }, - }; + item.serialize(writer)?; } }), Some(&FieldType::FieldTypeVec { .. }) => { @@ -487,18 +447,18 @@ pub fn serialize( #[allow(unused_variables)] fn serialize(&self, writer: &mut yaserde::ser::Serializer) -> Result<(), String> { - if let Some(label) = writer.get_start_event_name() { - let struct_start_event = XmlEvent::start_element(label.as_ref()); - #build_attributes - let _ret = writer.write(struct_start_event); - return Ok(()) - } - error!("Struct: start to expand {:?}", #root); let skip = writer.skip_start_end(); + if !skip { - let struct_start_event = XmlEvent::start_element(#root)#add_namespaces; - #build_attributes - let _ret = writer.write(struct_start_event); + if let Some(label) = writer.get_start_event_name() { + let struct_start_event = XmlEvent::start_element(label.as_ref()); + #build_attributes + let _ret = writer.write(struct_start_event); + } else { + let struct_start_event = XmlEvent::start_element(#root)#add_namespaces; + #build_attributes + let _ret = writer.write(struct_start_event); + } } #struct_inspector @@ -507,6 +467,7 @@ pub fn serialize( let struct_end_event = XmlEvent::end_element(); let _ret = writer.write(struct_end_event); } + Ok(()) } }