Merge pull request #48 from media-io/skip_serializing_if
Skip serializing if
This commit is contained in:
		
						commit
						077b2f51e3
					
				| @ -16,7 +16,7 @@ macro_rules! convert_and_validate { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[test] | #[test] | ||||||
| fn se_default_field_string() { | fn ser_default_field_string() { | ||||||
|   fn default_string() -> String { |   fn default_string() -> String { | ||||||
|     "my_default_value".to_string() |     "my_default_value".to_string() | ||||||
|   } |   } | ||||||
| @ -46,7 +46,7 @@ fn se_default_field_string() { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[test] | #[test] | ||||||
| fn se_default_field_boolean() { | fn ser_default_field_boolean() { | ||||||
|   fn default_boolean() -> bool { |   fn default_boolean() -> bool { | ||||||
|     true |     true | ||||||
|   } |   } | ||||||
| @ -67,7 +67,7 @@ fn se_default_field_boolean() { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[test] | #[test] | ||||||
| fn se_default_field_number() { | fn ser_default_field_number() { | ||||||
|   fn default_number() -> u8 { |   fn default_number() -> u8 { | ||||||
|     6 |     6 | ||||||
|   } |   } | ||||||
| @ -84,7 +84,7 @@ fn se_default_field_number() { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[test] | #[test] | ||||||
| fn se_default_attribute_string() { | fn ser_default_attribute_string() { | ||||||
|   fn default_string() -> String { |   fn default_string() -> String { | ||||||
|     "my_default_value".to_string() |     "my_default_value".to_string() | ||||||
|   } |   } | ||||||
| @ -183,7 +183,7 @@ fn ser_struct_default_namespace_via_attribute() { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[test] | #[test] | ||||||
| fn de_struct_namespace_nested() { | fn ser_struct_namespace_nested() { | ||||||
|   #[derive(YaSerialize, Default, PartialEq, Debug)] |   #[derive(YaSerialize, Default, PartialEq, Debug)] | ||||||
|   #[yaserde(prefix = "nsa", namespace = "nsa: http://www.sample.com/ns/a")] |   #[yaserde(prefix = "nsa", namespace = "nsa: http://www.sample.com/ns/a")] | ||||||
|   struct A { |   struct A { | ||||||
							
								
								
									
										68
									
								
								yaserde/tests/ser_skip.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								yaserde/tests/ser_skip.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,68 @@ | |||||||
|  | extern crate log; | ||||||
|  | extern crate xml; | ||||||
|  | extern crate yaserde; | ||||||
|  | #[macro_use] | ||||||
|  | extern crate yaserde_derive; | ||||||
|  | 
 | ||||||
|  | use std::io::Write; | ||||||
|  | use yaserde::ser::to_string; | ||||||
|  | use yaserde::YaSerialize; | ||||||
|  | 
 | ||||||
|  | macro_rules! convert_and_validate { | ||||||
|  |   ($model: expr, $content: expr) => { | ||||||
|  |     let data: Result<String, String> = to_string(&$model); | ||||||
|  |     assert_eq!( | ||||||
|  |       data, | ||||||
|  |       Ok( | ||||||
|  |         String::from($content) | ||||||
|  |           .split("\n") | ||||||
|  |           .map(|s| s.trim()) | ||||||
|  |           .collect::<String>() | ||||||
|  |       ) | ||||||
|  |     ); | ||||||
|  |   }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #[test] | ||||||
|  | fn ser_skip_serializing_if_for_struct() { | ||||||
|  |   #[derive(YaSerialize, PartialEq, Debug)] | ||||||
|  |   #[yaserde(root = "base")] | ||||||
|  |   pub struct XmlStruct { | ||||||
|  |     #[yaserde(skip_serializing_if = "check_string_function")] | ||||||
|  |     string_item: String, | ||||||
|  |     #[yaserde(skip_serializing_if = "check_bool_function")] | ||||||
|  |     bool_item: bool, | ||||||
|  |     #[yaserde(skip_serializing_if = "check_f32_function")] | ||||||
|  |     f32_item: f32, | ||||||
|  |     #[yaserde(skip_serializing_if = "check_option_string_function")] | ||||||
|  |     option_string_item: Option<String>, | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   impl XmlStruct { | ||||||
|  |     fn check_string_function(&self, value: &String) -> bool { | ||||||
|  |       value == "something" | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn check_option_string_function(&self, value: &Option<String>) -> bool { | ||||||
|  |       value == &Some("something".to_string()) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn check_bool_function(&self, value: &bool) -> bool { | ||||||
|  |       value == &true | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn check_f32_function(&self, value: &f32) -> bool { | ||||||
|  |       value == &0.0 | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   let model = XmlStruct { | ||||||
|  |     string_item: "something".to_string(), | ||||||
|  |     bool_item: true, | ||||||
|  |     f32_item: 0.0, | ||||||
|  |     option_string_item: Some("something".to_string()), | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   let content = "<?xml version=\"1.0\" encoding=\"utf-8\"?><base />"; | ||||||
|  |   convert_and_validate!(model, content); | ||||||
|  | } | ||||||
| @ -82,7 +82,7 @@ fn ser_list_of_items() { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[test] | #[test] | ||||||
| fn se_attributes() { | fn ser_attributes() { | ||||||
|   #[derive(YaSerialize, PartialEq, Debug)] |   #[derive(YaSerialize, PartialEq, Debug)] | ||||||
|   #[yaserde(root = "base")] |   #[yaserde(root = "base")] | ||||||
|   pub struct XmlStruct { |   pub struct XmlStruct { | ||||||
| @ -125,7 +125,7 @@ fn se_attributes() { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[test] | #[test] | ||||||
| fn se_attributes_complex() { | fn ser_attributes_complex() { | ||||||
|   mod other_mod { |   mod other_mod { | ||||||
|     use super::*; |     use super::*; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -14,6 +14,7 @@ pub struct YaSerdeAttribute { | |||||||
|   pub prefix: Option<String>, |   pub prefix: Option<String>, | ||||||
|   pub root: Option<String>, |   pub root: Option<String>, | ||||||
|   pub rename: Option<String>, |   pub rename: Option<String>, | ||||||
|  |   pub skip_serializing_if: Option<String>, | ||||||
|   pub text: bool, |   pub text: bool, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -41,6 +42,7 @@ impl YaSerdeAttribute { | |||||||
|     let mut prefix = None; |     let mut prefix = None; | ||||||
|     let mut rename = None; |     let mut rename = None; | ||||||
|     let mut root = None; |     let mut root = None; | ||||||
|  |     let mut skip_serializing_if = None; | ||||||
|     let mut text = false; |     let mut text = false; | ||||||
| 
 | 
 | ||||||
|     for attr in attrs.iter() { |     for attr in attrs.iter() { | ||||||
| @ -85,6 +87,9 @@ impl YaSerdeAttribute { | |||||||
|                   "root" => { |                   "root" => { | ||||||
|                     root = get_value(&mut attr_iter); |                     root = get_value(&mut attr_iter); | ||||||
|                   } |                   } | ||||||
|  |                   "skip_serializing_if" => { | ||||||
|  |                     skip_serializing_if = get_value(&mut attr_iter); | ||||||
|  |                   } | ||||||
|                   "text" => { |                   "text" => { | ||||||
|                     text = true; |                     text = true; | ||||||
|                   } |                   } | ||||||
| @ -106,6 +111,7 @@ impl YaSerdeAttribute { | |||||||
|       prefix, |       prefix, | ||||||
|       rename, |       rename, | ||||||
|       root, |       root, | ||||||
|  |       skip_serializing_if, | ||||||
|       text, |       text, | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| @ -126,6 +132,7 @@ fn parse_empty_attributes() { | |||||||
|       prefix: None, |       prefix: None, | ||||||
|       root: None, |       root: None, | ||||||
|       rename: None, |       rename: None, | ||||||
|  |       skip_serializing_if: None, | ||||||
|       text: false, |       text: false, | ||||||
|     }, |     }, | ||||||
|     attrs |     attrs | ||||||
| @ -175,6 +182,7 @@ fn parse_attributes() { | |||||||
|       prefix: None, |       prefix: None, | ||||||
|       root: None, |       root: None, | ||||||
|       rename: None, |       rename: None, | ||||||
|  |       skip_serializing_if: None, | ||||||
|       text: false, |       text: false, | ||||||
|     }, |     }, | ||||||
|     attrs |     attrs | ||||||
| @ -228,6 +236,7 @@ fn parse_attributes_with_values() { | |||||||
|       prefix: None, |       prefix: None, | ||||||
|       root: None, |       root: None, | ||||||
|       rename: None, |       rename: None, | ||||||
|  |       skip_serializing_if: None, | ||||||
|       text: false, |       text: false, | ||||||
|     }, |     }, | ||||||
|     attrs |     attrs | ||||||
|  | |||||||
| @ -1,55 +1,50 @@ | |||||||
|  | use attribute::*; | ||||||
| use proc_macro2::{Ident, Span, TokenStream}; | use proc_macro2::{Ident, Span, TokenStream}; | ||||||
| 
 | 
 | ||||||
| pub fn enclose_formatted_characters(label: &Ident, label_name: String) -> TokenStream { | pub fn enclose_formatted_characters(label: &Ident, label_name: String) -> TokenStream { | ||||||
|   quote! { |   enclose_xml_event(label_name, quote!(format!("{}", &self.#label))) | ||||||
|     let start_event = XmlEvent::start_element(#label_name); |  | ||||||
|     let _ret = writer.write(start_event); |  | ||||||
| 
 |  | ||||||
|     let yas_value = format!("{}", &self.#label); |  | ||||||
|     let data_event = XmlEvent::characters(&yas_value); |  | ||||||
|     let _ret = writer.write(data_event); |  | ||||||
| 
 |  | ||||||
|     let end_event = XmlEvent::end_element(); |  | ||||||
|     let _ret = writer.write(end_event); |  | ||||||
|   } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn enclose_formatted_characters_for_value(label: &Ident, label_name: String) -> TokenStream { | pub fn enclose_formatted_characters_for_value(label: &Ident, label_name: String) -> TokenStream { | ||||||
|   quote! { |   enclose_xml_event(label_name, quote!(format!("{}", #label))) | ||||||
|     let start_event = XmlEvent::start_element(#label_name); |  | ||||||
|     let _ret = writer.write(start_event); |  | ||||||
| 
 |  | ||||||
|     let value = format!("{}", #label); |  | ||||||
|     let data_event = XmlEvent::characters(&value); |  | ||||||
|     let _ret = writer.write(data_event); |  | ||||||
| 
 |  | ||||||
|     let end_event = XmlEvent::end_element(); |  | ||||||
|     let _ret = writer.write(end_event); |  | ||||||
|   } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn enclose_characters(label: &Option<Ident>, label_name: String) -> TokenStream { | pub fn enclose_characters(label: &Option<Ident>, label_name: String) -> TokenStream { | ||||||
|  |   enclose_xml_event(label_name, quote!(format!("{}", self.#label))) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub fn enclose_xml_event(label_name: String, yaserde_format: TokenStream) -> TokenStream { | ||||||
|   quote! { |   quote! { | ||||||
|     let start_event = XmlEvent::start_element(#label_name); |     let start_event = XmlEvent::start_element(#label_name); | ||||||
|     let _ret = writer.write(start_event); |     writer.write(start_event).map_err(|e| e.to_string())?; | ||||||
| 
 | 
 | ||||||
|     let value = format!("{}", self.#label); |     let yaserde_value = #yaserde_format; | ||||||
|     let data_event = XmlEvent::characters(&value); |     let data_event = XmlEvent::characters(&yaserde_value); | ||||||
|     let _ret = writer.write(data_event); |     writer.write(data_event).map_err(|e| e.to_string())?; | ||||||
| 
 | 
 | ||||||
|     let end_event = XmlEvent::end_element(); |     let end_event = XmlEvent::end_element(); | ||||||
|     let _ret = writer.write(end_event); |     writer.write(end_event).map_err(|e| e.to_string())?; | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn serialize_element( | pub fn serialize_element( | ||||||
|   label: &Option<Ident>, |   label: &Option<Ident>, | ||||||
|   label_name: String, |   label_name: String, | ||||||
|   default: &Option<String>, |   conditions: &TokenStream, | ||||||
| ) -> Option<TokenStream> { | ) -> Option<TokenStream> { | ||||||
|   let inner = enclose_characters(label, label_name); |   let inner = enclose_characters(label, label_name); | ||||||
| 
 | 
 | ||||||
|   if let Some(ref d) = default { |   Some(quote! { | ||||||
|  |     #conditions { | ||||||
|  |       #inner | ||||||
|  |     } | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub fn condition_generator(label: &Option<Ident>, attributes: &YaSerdeAttribute) -> TokenStream { | ||||||
|  |   let mut conditions = None; | ||||||
|  | 
 | ||||||
|  |   if let Some(ref d) = attributes.default { | ||||||
|     let default_function = Ident::new( |     let default_function = Ident::new( | ||||||
|       &d, |       &d, | ||||||
|       label |       label | ||||||
| @ -57,14 +52,23 @@ pub fn serialize_element( | |||||||
|         .map_or(Span::call_site(), |ident| ident.span()), |         .map_or(Span::call_site(), |ident| ident.span()), | ||||||
|     ); |     ); | ||||||
| 
 | 
 | ||||||
|     Some(quote! { |     conditions = Some(quote!(self.#label != #default_function())) | ||||||
|       if self.#label != #default_function() { |  | ||||||
|         #inner |  | ||||||
|       } |  | ||||||
|     }) |  | ||||||
|   } else { |  | ||||||
|     Some(quote! { |  | ||||||
|       #inner |  | ||||||
|     }) |  | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   if let Some(ref s) = attributes.skip_serializing_if { | ||||||
|  |     let skip_if_function = Ident::new( | ||||||
|  |       &s, | ||||||
|  |       label | ||||||
|  |         .as_ref() | ||||||
|  |         .map_or(Span::call_site(), |ident| ident.span()), | ||||||
|  |     ); | ||||||
|  | 
 | ||||||
|  |     conditions = if let Some(prev_conditions) = conditions { | ||||||
|  |       Some(quote!(!#skip_if_function() && #prev_conditions)) | ||||||
|  |     } else { | ||||||
|  |       Some(quote!(!self.#skip_if_function(&self.#label))) | ||||||
|  |     }; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   conditions.map(|c| quote!(if #c)).unwrap_or(quote!()) | ||||||
| } | } | ||||||
|  | |||||||
| @ -33,7 +33,7 @@ pub fn serialize( | |||||||
|         Fields::Unit => Some(quote! { |         Fields::Unit => Some(quote! { | ||||||
|           &#name::#label => { |           &#name::#label => { | ||||||
|             let data_event = XmlEvent::characters(#label_name); |             let data_event = XmlEvent::characters(#label_name); | ||||||
|             let _ret = writer.write(data_event); |             writer.write(data_event).map_err(|e| e.to_string())?; | ||||||
|           } |           } | ||||||
|         }), |         }), | ||||||
|         Fields::Named(ref fields) => { |         Fields::Named(ref fields) => { | ||||||
| @ -50,7 +50,7 @@ pub fn serialize( | |||||||
|               if field_attrs.text { |               if field_attrs.text { | ||||||
|                 return Some(quote!( |                 return Some(quote!( | ||||||
|                   let data_event = XmlEvent::characters(&self.#field_label); |                   let data_event = XmlEvent::characters(&self.#field_label); | ||||||
|                   let _ret = writer.write(data_event); |                   writer.write(data_event).map_err(|e| e.to_string())?; | ||||||
|                 )); |                 )); | ||||||
|               } |               } | ||||||
| 
 | 
 | ||||||
| @ -61,19 +61,21 @@ pub fn serialize( | |||||||
|               let field_label_name = renamed_field_label.unwrap().to_string(); |               let field_label_name = renamed_field_label.unwrap().to_string(); | ||||||
| 
 | 
 | ||||||
|               match get_field_type(field) { |               match get_field_type(field) { | ||||||
|                 Some(FieldType::FieldTypeString) => Some(quote! { |                 Some(FieldType::FieldTypeString) => Some({ | ||||||
|                   match self { |                   quote! { | ||||||
|                     &#name::#label{ref #field_label, ..} => { |                     match self { | ||||||
|                       let struct_start_event = XmlEvent::start_element(#field_label_name); |                       &#name::#label{ref #field_label, ..} => { | ||||||
|                       let _ret = writer.write(struct_start_event); |                         let struct_start_event = XmlEvent::start_element(#field_label_name); | ||||||
|  |                         writer.write(struct_start_event).map_err(|e| e.to_string())?; | ||||||
| 
 | 
 | ||||||
|                       let data_event = XmlEvent::characters(#field_label); |                         let data_event = XmlEvent::characters(#field_label); | ||||||
|                       let _ret = writer.write(data_event); |                         writer.write(data_event).map_err(|e| e.to_string())?; | ||||||
| 
 | 
 | ||||||
|                       let struct_end_event = XmlEvent::end_element(); |                         let struct_end_event = XmlEvent::end_element(); | ||||||
|                       let _ret = writer.write(struct_end_event); |                         writer.write(struct_end_event).map_err(|e| e.to_string())?; | ||||||
|                     }, |                       }, | ||||||
|                     _ => {}, |                       _ => {}, | ||||||
|  |                     } | ||||||
|                   } |                   } | ||||||
|                 }), |                 }), | ||||||
|                 Some(FieldType::FieldTypeStruct { .. }) => Some(quote! { |                 Some(FieldType::FieldTypeStruct { .. }) => Some(quote! { | ||||||
| @ -123,24 +125,24 @@ pub fn serialize( | |||||||
|               let write_element = |action: &TokenStream| { |               let write_element = |action: &TokenStream| { | ||||||
|                 quote! { |                 quote! { | ||||||
|                   let struct_start_event = XmlEvent::start_element(#label_name); |                   let struct_start_event = XmlEvent::start_element(#label_name); | ||||||
|                   let _ret = writer.write(struct_start_event); |                   writer.write(struct_start_event).map_err(|e| e.to_string())?; | ||||||
| 
 | 
 | ||||||
|                   #action |                   #action | ||||||
| 
 | 
 | ||||||
|                   let struct_end_event = XmlEvent::end_element(); |                   let struct_end_event = XmlEvent::end_element(); | ||||||
|                   let _ret = writer.write(struct_end_event); |                   writer.write(struct_end_event).map_err(|e| e.to_string())?; | ||||||
|                 } |                 } | ||||||
|               }; |               }; | ||||||
| 
 | 
 | ||||||
|               let write_string_chars = quote! { |               let write_string_chars = quote! { | ||||||
|                 let data_event = XmlEvent::characters(item); |                 let data_event = XmlEvent::characters(item); | ||||||
|                 let _ret = writer.write(data_event); |                 writer.write(data_event).map_err(|e| e.to_string())?; | ||||||
|               }; |               }; | ||||||
| 
 | 
 | ||||||
|               let write_simple_type = write_element("e! { |               let write_simple_type = write_element("e! { | ||||||
|                 let s = item.to_string(); |                 let s = item.to_string(); | ||||||
|                 let data_event = XmlEvent::characters(&s); |                 let data_event = XmlEvent::characters(&s); | ||||||
|                 let _ret = writer.write(data_event); |                 writer.write(data_event).map_err(|e| e.to_string())?; | ||||||
|               }); |               }); | ||||||
| 
 | 
 | ||||||
|               let serialize = quote! { |               let serialize = quote! { | ||||||
| @ -239,10 +241,10 @@ pub fn serialize( | |||||||
|         if !skip { |         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); |             writer.write(struct_start_event).map_err(|e| e.to_string())?; | ||||||
|           } else { |           } else { | ||||||
|             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); |             writer.write(struct_start_event).map_err(|e| e.to_string())?; | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -252,7 +254,7 @@ pub fn serialize( | |||||||
| 
 | 
 | ||||||
|         if !skip { |         if !skip { | ||||||
|           let struct_end_event = XmlEvent::end_element(); |           let struct_end_event = XmlEvent::end_element(); | ||||||
|           let _ret = writer.write(struct_end_event); |           writer.write(struct_end_event).map_err(|e| e.to_string())?; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         Ok(()) |         Ok(()) | ||||||
|  | |||||||
| @ -126,7 +126,7 @@ pub fn serialize( | |||||||
|             } |             } | ||||||
|           } |           } | ||||||
|           FieldType::FieldTypeVec { .. } => { |           FieldType::FieldTypeVec { .. } => { | ||||||
|             let item_ident = Ident::new("yas_item", field.span()); |             let item_ident = Ident::new("yaserde_item", field.span()); | ||||||
|             let inner = enclose_formatted_characters(&item_ident, label_name); |             let inner = enclose_formatted_characters(&item_ident, label_name); | ||||||
| 
 | 
 | ||||||
|             if let Some(ref d) = field_attrs.default { |             if let Some(ref d) = field_attrs.default { | ||||||
| @ -134,8 +134,8 @@ pub fn serialize( | |||||||
| 
 | 
 | ||||||
|               Some(quote! { |               Some(quote! { | ||||||
|                 if self.#label != #default_function() { |                 if self.#label != #default_function() { | ||||||
|                   if let Some(ref yas_list) = self.#label { |                   if let Some(ref yaserde_list) = self.#label { | ||||||
|                     for yas_item in yas_list.iter() { |                     for yaserde_item in yaserde_list.iter() { | ||||||
|                       #inner |                       #inner | ||||||
|                     } |                     } | ||||||
|                   } |                   } | ||||||
| @ -143,7 +143,7 @@ pub fn serialize( | |||||||
|               }) |               }) | ||||||
|             } else { |             } else { | ||||||
|               Some(quote! { |               Some(quote! { | ||||||
|                 for yas_item in &self.#label { |                 for yaserde_item in &self.#label { | ||||||
|                   #inner |                   #inner | ||||||
|                 } |                 } | ||||||
|               }) |               }) | ||||||
| @ -236,11 +236,12 @@ pub fn serialize( | |||||||
|       if field_attrs.text { |       if field_attrs.text { | ||||||
|         return Some(quote!( |         return Some(quote!( | ||||||
|           let data_event = XmlEvent::characters(&self.#label); |           let data_event = XmlEvent::characters(&self.#label); | ||||||
|           let _ret = writer.write(data_event); |           writer.write(data_event).map_err(|e| e.to_string())?; | ||||||
|         )); |         )); | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       let label_name = build_label_name(&field, &field_attrs); |       let label_name = build_label_name(&field, &field_attrs); | ||||||
|  |       let conditions = condition_generator(label, &field_attrs); | ||||||
| 
 | 
 | ||||||
|       get_field_type(field).and_then(|f| match f { |       get_field_type(field).and_then(|f| match f { | ||||||
|         FieldType::FieldTypeString |         FieldType::FieldTypeString | ||||||
| @ -254,7 +255,7 @@ pub fn serialize( | |||||||
|         | FieldType::FieldTypeI64 |         | FieldType::FieldTypeI64 | ||||||
|         | FieldType::FieldTypeU64 |         | FieldType::FieldTypeU64 | ||||||
|         | FieldType::FieldTypeF32 |         | FieldType::FieldTypeF32 | ||||||
|         | FieldType::FieldTypeF64 => serialize_element(label, label_name, &field_attrs.default), |         | FieldType::FieldTypeF64 => serialize_element(label, label_name, &conditions), | ||||||
|         FieldType::FieldTypeOption { data_type } => match *data_type { |         FieldType::FieldTypeOption { data_type } => match *data_type { | ||||||
|           FieldType::FieldTypeString |           FieldType::FieldTypeString | ||||||
|           | FieldType::FieldTypeBool |           | FieldType::FieldTypeBool | ||||||
| @ -268,52 +269,30 @@ pub fn serialize( | |||||||
|           | FieldType::FieldTypeU64 |           | FieldType::FieldTypeU64 | ||||||
|           | FieldType::FieldTypeF32 |           | FieldType::FieldTypeF32 | ||||||
|           | FieldType::FieldTypeF64 => { |           | FieldType::FieldTypeF64 => { | ||||||
|             let item_ident = Ident::new("yas_item", field.span()); |             let item_ident = Ident::new("yaserde_item", field.span()); | ||||||
|             let inner = enclose_formatted_characters_for_value(&item_ident, label_name); |             let inner = enclose_formatted_characters_for_value(&item_ident, label_name); | ||||||
| 
 | 
 | ||||||
|             if let Some(ref d) = field_attrs.default { |             Some(quote! { | ||||||
|               let default_function = Ident::new(&d, field.span()); |               #conditions { | ||||||
| 
 |                 if let Some(ref yaserde_item) = self.#label { | ||||||
|               Some(quote! { |  | ||||||
|                 if self.#label != #default_function() { |  | ||||||
|                   if let Some(ref yas_item) = self.#label { |  | ||||||
|                     #inner |  | ||||||
|                   } |  | ||||||
|                 } |  | ||||||
|               }) |  | ||||||
|             } else { |  | ||||||
|               Some(quote! { |  | ||||||
|                 if let Some(ref yas_item) = self.#label { |  | ||||||
|                   #inner |                   #inner | ||||||
|                 } |                 } | ||||||
|               }) |               } | ||||||
|             } |             }) | ||||||
|           } |           } | ||||||
|           FieldType::FieldTypeVec { .. } => { |           FieldType::FieldTypeVec { .. } => { | ||||||
|             let item_ident = Ident::new("yas_item", field.span()); |             let item_ident = Ident::new("yaserde_item", field.span()); | ||||||
|             let inner = enclose_formatted_characters_for_value(&item_ident, label_name); |             let inner = enclose_formatted_characters_for_value(&item_ident, label_name); | ||||||
| 
 | 
 | ||||||
|             if let Some(ref d) = field_attrs.default { |             Some(quote! { | ||||||
|               let default_function = Ident::new(&d, field.span()); |               #conditions { | ||||||
| 
 |                 if let Some(ref yaserde_items) = &self.#label { | ||||||
|               Some(quote! { |                   for yaserde_item in yaserde_items.iter() { | ||||||
|                 if self.#label != #default_function() { |  | ||||||
|                   if let Some(ref yas_items) = &self.#label { |  | ||||||
|                     for yas_item in yas_items.iter() { |  | ||||||
|                       #inner |  | ||||||
|                     } |  | ||||||
|                   } |  | ||||||
|                 } |  | ||||||
|               }) |  | ||||||
|             } else { |  | ||||||
|               Some(quote! { |  | ||||||
|                 if let Some(ref yas_items) = &self.#label { |  | ||||||
|                   for yas_item in yas_items.iter() { |  | ||||||
|                     #inner |                     #inner | ||||||
|                   } |                   } | ||||||
|                 } |                 } | ||||||
|               }) |               } | ||||||
|             } |             }) | ||||||
|           } |           } | ||||||
|           FieldType::FieldTypeStruct { .. } => Some(if field_attrs.flatten { |           FieldType::FieldTypeStruct { .. } => Some(if field_attrs.flatten { | ||||||
|             quote! { |             quote! { | ||||||
| @ -334,26 +313,26 @@ pub fn serialize( | |||||||
|           }), |           }), | ||||||
|           _ => unimplemented!(), |           _ => unimplemented!(), | ||||||
|         }, |         }, | ||||||
|         FieldType::FieldTypeStruct { .. } => Some(if field_attrs.flatten { |         FieldType::FieldTypeStruct { .. } => { | ||||||
|           quote! { |           let (start_event, skip_start) = if field_attrs.flatten { | ||||||
|             writer.set_start_event_name(None); |             (quote!(None), true) | ||||||
|             writer.set_skip_start_end(true); |           } else { | ||||||
|  |             (quote!(Some(#label_name.to_string())), false) | ||||||
|  |           }; | ||||||
|  | 
 | ||||||
|  |           Some(quote! { | ||||||
|  |             writer.set_start_event_name(#start_event); | ||||||
|  |             writer.set_skip_start_end(#skip_start); | ||||||
|             self.#label.serialize(writer)?; |             self.#label.serialize(writer)?; | ||||||
|           } |           }) | ||||||
|         } else { |         } | ||||||
|           quote! { |  | ||||||
|             writer.set_start_event_name(Some(#label_name.to_string())); |  | ||||||
|             writer.set_skip_start_end(false); |  | ||||||
|             self.#label.serialize(writer)?; |  | ||||||
|           } |  | ||||||
|         }), |  | ||||||
|         FieldType::FieldTypeVec { data_type } => match *data_type { |         FieldType::FieldTypeVec { data_type } => match *data_type { | ||||||
|           FieldType::FieldTypeString => { |           FieldType::FieldTypeString => { | ||||||
|             let item_ident = Ident::new("yas_item", field.span()); |             let item_ident = Ident::new("yaserde_item", field.span()); | ||||||
|             let inner = enclose_formatted_characters_for_value(&item_ident, label_name); |             let inner = enclose_formatted_characters_for_value(&item_ident, label_name); | ||||||
| 
 | 
 | ||||||
|             Some(quote! { |             Some(quote! { | ||||||
|               for yas_item in &self.#label { |               for yaserde_item in &self.#label { | ||||||
|                 #inner |                 #inner | ||||||
|               } |               } | ||||||
|             }) |             }) | ||||||
| @ -369,11 +348,11 @@ pub fn serialize( | |||||||
|           | FieldType::FieldTypeU64 |           | FieldType::FieldTypeU64 | ||||||
|           | FieldType::FieldTypeF32 |           | FieldType::FieldTypeF32 | ||||||
|           | FieldType::FieldTypeF64 => { |           | FieldType::FieldTypeF64 => { | ||||||
|             let item_ident = Ident::new("yas_item", field.span()); |             let item_ident = Ident::new("yaserde_item", field.span()); | ||||||
|             let inner = enclose_formatted_characters_for_value(&item_ident, label_name); |             let inner = enclose_formatted_characters_for_value(&item_ident, label_name); | ||||||
| 
 | 
 | ||||||
|             Some(quote! { |             Some(quote! { | ||||||
|               for yas_item in &self.#label { |               for yaserde_item in &self.#label { | ||||||
|                 #inner |                 #inner | ||||||
|               } |               } | ||||||
|             }) |             }) | ||||||
| @ -413,17 +392,17 @@ pub fn serialize( | |||||||
|         let skip = writer.skip_start_end(); |         let skip = writer.skip_start_end(); | ||||||
| 
 | 
 | ||||||
|         if !skip { |         if !skip { | ||||||
|           let label = writer.get_start_event_name().unwrap_or_else(|| #root.to_string()); |           let yaserde_label = writer.get_start_event_name().unwrap_or_else(|| #root.to_string()); | ||||||
|           let struct_start_event = XmlEvent::start_element(label.as_ref())#add_namespaces; |           let struct_start_event = XmlEvent::start_element(yaserde_label.as_ref())#add_namespaces; | ||||||
|           #build_attributes |           #build_attributes | ||||||
|           let _ret = writer.write(struct_start_event); |           writer.write(struct_start_event).map_err(|e| e.to_string())?; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         #struct_inspector |         #struct_inspector | ||||||
| 
 | 
 | ||||||
|         if !skip { |         if !skip { | ||||||
|           let struct_end_event = XmlEvent::end_element(); |           let struct_end_event = XmlEvent::end_element(); | ||||||
|           let _ret = writer.write(struct_end_event); |           writer.write(struct_end_event).map_err(|e| e.to_string())?; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         Ok(()) |         Ok(()) | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user