Merge pull request #153 from lbenini/skip-fixes
skip/skip_if are not working for Enum, Struct and Vec
This commit is contained in:
		
						commit
						8483c3be79
					
				| @ -25,3 +25,72 @@ fn skip_serializing() { | |||||||
|   let content = "<base />"; |   let content = "<base />"; | ||||||
|   serialize_and_validate!(model, content); |   serialize_and_validate!(model, content); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | #[test] | ||||||
|  | fn skip_serializing_for_nested_struct() { | ||||||
|  |   init(); | ||||||
|  | 
 | ||||||
|  |   #[derive(YaSerialize, PartialEq, Debug)] | ||||||
|  |   #[yaserde(rename = "base")] | ||||||
|  |   pub struct XmlStruct { | ||||||
|  |     #[yaserde(skip_serializing)] | ||||||
|  |     skipped_serializing: XmlStructChild, | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   #[derive(YaSerialize, PartialEq, Debug)] | ||||||
|  |   #[yaserde(rename = "child")] | ||||||
|  |   pub struct XmlStructChild { | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   let model = XmlStruct { | ||||||
|  |     skipped_serializing: XmlStructChild{}, | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   let content = "<base />"; | ||||||
|  |   serialize_and_validate!(model, content); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #[test] | ||||||
|  | fn skip_serializing_for_enum() { | ||||||
|  |   init(); | ||||||
|  | 
 | ||||||
|  |   #[derive(YaSerialize, PartialEq, Debug)] | ||||||
|  |   #[yaserde(rename = "base")] | ||||||
|  |   pub struct XmlStruct { | ||||||
|  |     #[yaserde(skip_serializing)] | ||||||
|  |     skipped_serializing: XmlEnum, | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   #[derive(YaSerialize, PartialEq, Debug)] | ||||||
|  |   #[yaserde(rename = "child")] | ||||||
|  |   pub enum XmlEnum { | ||||||
|  |     Ok | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   let model = XmlStruct { | ||||||
|  |     skipped_serializing: XmlEnum::Ok, | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   let content = "<base />"; | ||||||
|  |   serialize_and_validate!(model, content); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #[test] | ||||||
|  | fn skip_serializing_for_vec() { | ||||||
|  |   init(); | ||||||
|  | 
 | ||||||
|  |   #[derive(YaSerialize, PartialEq, Debug)] | ||||||
|  |   #[yaserde(rename = "base")] | ||||||
|  |   pub struct XmlStruct { | ||||||
|  |     #[yaserde(skip_serializing)] | ||||||
|  |     skipped_serializing: Vec<i8>, | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   let model = XmlStruct { | ||||||
|  |     skipped_serializing: vec![1,2,3], | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   let content = "<base />"; | ||||||
|  |   serialize_and_validate!(model, content); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | |||||||
| @ -119,3 +119,89 @@ fn skip_serializing_if_for_struct_attributes() { | |||||||
|   let content = "<base />"; |   let content = "<base />"; | ||||||
|   serialize_and_validate!(model, content); |   serialize_and_validate!(model, content); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | #[test] | ||||||
|  | fn skip_serializing_if_for_nested_struct() { | ||||||
|  |   init(); | ||||||
|  | 
 | ||||||
|  |   #[derive(YaSerialize, PartialEq, Debug)] | ||||||
|  |   #[yaserde(rename = "base")] | ||||||
|  |   pub struct XmlStruct { | ||||||
|  |     #[yaserde(skip_serializing_if="check_child")] | ||||||
|  |     skipped_serializing: XmlStructChild, | ||||||
|  |   } | ||||||
|  |   impl XmlStruct | ||||||
|  |   { | ||||||
|  |     fn check_child(&self, _child:&XmlStructChild)->bool | ||||||
|  |     { | ||||||
|  |       true | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   #[derive(YaSerialize, PartialEq, Debug)] | ||||||
|  |   #[yaserde(rename = "child")] | ||||||
|  |   pub struct XmlStructChild { | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   let model = XmlStruct { | ||||||
|  |     skipped_serializing: XmlStructChild{}, | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   let content = "<base />"; | ||||||
|  |   serialize_and_validate!(model, content); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #[test] | ||||||
|  | fn skip_serializing_if_for_enum() { | ||||||
|  |   init(); | ||||||
|  | 
 | ||||||
|  |   #[derive(YaSerialize, PartialEq, Debug)] | ||||||
|  |   #[yaserde(rename = "base")] | ||||||
|  |   pub struct XmlStruct { | ||||||
|  |     #[yaserde(skip_serializing_if="check_enum")] | ||||||
|  |     skipped_serializing: XmlEnum, | ||||||
|  |   } | ||||||
|  |   impl XmlStruct | ||||||
|  |   { | ||||||
|  |     fn check_enum(&self, _child:&XmlEnum)->bool | ||||||
|  |     { | ||||||
|  |       true | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   #[derive(YaSerialize, PartialEq, Debug)] | ||||||
|  |   #[yaserde(rename = "child")] | ||||||
|  |   pub enum XmlEnum { | ||||||
|  |     Ok | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   let model = XmlStruct { | ||||||
|  |     skipped_serializing: XmlEnum::Ok, | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   let content = "<base />"; | ||||||
|  |   serialize_and_validate!(model, content); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #[test] | ||||||
|  | fn skip_serializing_if_for_vec() { | ||||||
|  |   init(); | ||||||
|  | 
 | ||||||
|  |   #[derive(YaSerialize, PartialEq, Debug)] | ||||||
|  |   #[yaserde(rename = "base")] | ||||||
|  |   pub struct XmlStruct { | ||||||
|  |     #[yaserde(skip_serializing_if="check_vec")] | ||||||
|  |     skipped_serializing: Vec<i8>, | ||||||
|  |   } | ||||||
|  |   impl XmlStruct | ||||||
|  |   { | ||||||
|  |     fn check_vec(&self, _child:&Vec<i8>)->bool | ||||||
|  |     { | ||||||
|  |       true | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   let model = XmlStruct { | ||||||
|  |     skipped_serializing: vec![1,2,3], | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   let content = "<base />"; | ||||||
|  |   serialize_and_validate!(model, content); | ||||||
|  | } | ||||||
| @ -215,20 +215,24 @@ pub fn serialize( | |||||||
|           } |           } | ||||||
|           Field::FieldStruct { .. } => Some(if field.is_flatten() { |           Field::FieldStruct { .. } => Some(if field.is_flatten() { | ||||||
|             quote! { |             quote! { | ||||||
|  |               #conditions { | ||||||
|                 if let ::std::option::Option::Some(ref item) = &self.#label { |                 if let ::std::option::Option::Some(ref item) = &self.#label { | ||||||
|                   writer.set_start_event_name(::std::option::Option::None); |                   writer.set_start_event_name(::std::option::Option::None); | ||||||
|                   writer.set_skip_start_end(true); |                   writer.set_skip_start_end(true); | ||||||
|                   ::yaserde::YaSerialize::serialize(item, writer)?; |                   ::yaserde::YaSerialize::serialize(item, writer)?; | ||||||
|                 } |                 } | ||||||
|               } |               } | ||||||
|  |             } | ||||||
|           } else { |           } else { | ||||||
|             quote! { |             quote! { | ||||||
|  |               #conditions { | ||||||
|                 if let ::std::option::Option::Some(ref item) = &self.#label { |                 if let ::std::option::Option::Some(ref item) = &self.#label { | ||||||
|                   writer.set_start_event_name(::std::option::Option::Some(#label_name.to_string())); |                   writer.set_start_event_name(::std::option::Option::Some(#label_name.to_string())); | ||||||
|                   writer.set_skip_start_end(false); |                   writer.set_skip_start_end(false); | ||||||
|                   ::yaserde::YaSerialize::serialize(item, writer)?; |                   ::yaserde::YaSerialize::serialize(item, writer)?; | ||||||
|                 } |                 } | ||||||
|               } |               } | ||||||
|  |             } | ||||||
|           }), |           }), | ||||||
|           _ => unimplemented!(), |           _ => unimplemented!(), | ||||||
|         }, |         }, | ||||||
| @ -243,9 +247,11 @@ pub fn serialize( | |||||||
|           }; |           }; | ||||||
| 
 | 
 | ||||||
|           Some(quote! { |           Some(quote! { | ||||||
|  |             #conditions { | ||||||
|               writer.set_start_event_name(#start_event); |               writer.set_start_event_name(#start_event); | ||||||
|               writer.set_skip_start_end(#skip_start); |               writer.set_skip_start_end(#skip_start); | ||||||
|               ::yaserde::YaSerialize::serialize(&self.#label, writer)?; |               ::yaserde::YaSerialize::serialize(&self.#label, writer)?; | ||||||
|  |             } | ||||||
|           }) |           }) | ||||||
|         } |         } | ||||||
|         Field::FieldVec { data_type } => match *data_type { |         Field::FieldVec { data_type } => match *data_type { | ||||||
| @ -254,9 +260,11 @@ pub fn serialize( | |||||||
|             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! { | ||||||
|  |               #conditions { | ||||||
|                 for yaserde_item in &self.#label { |                 for yaserde_item in &self.#label { | ||||||
|                   #inner |                   #inner | ||||||
|                 } |                 } | ||||||
|  |               } | ||||||
|             }) |             }) | ||||||
|           } |           } | ||||||
|           Field::FieldBool |           Field::FieldBool | ||||||
| @ -274,12 +282,15 @@ pub fn serialize( | |||||||
|             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! { | ||||||
|  |               #conditions { | ||||||
|                 for yaserde_item in &self.#label { |                 for yaserde_item in &self.#label { | ||||||
|                   #inner |                   #inner | ||||||
|                 } |                 } | ||||||
|  |               } | ||||||
|             }) |             }) | ||||||
|           } |           } | ||||||
|           Field::FieldOption { .. } => Some(quote! { |           Field::FieldOption { .. } => Some(quote! { | ||||||
|  |             #conditions { | ||||||
|               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_start_event_name(None); | ||||||
| @ -287,23 +298,28 @@ pub fn serialize( | |||||||
|                   ::yaserde::YaSerialize::serialize(value, writer)?; |                   ::yaserde::YaSerialize::serialize(value, writer)?; | ||||||
|                 } |                 } | ||||||
|               } |               } | ||||||
|  |             } | ||||||
|           }), |           }), | ||||||
|           Field::FieldStruct { .. } => { |           Field::FieldStruct { .. } => { | ||||||
|             if field.is_flatten() { |             if field.is_flatten() { | ||||||
|               Some(quote! { |               Some(quote! { | ||||||
|  |                 #conditions { | ||||||
|                   for item in &self.#label { |                   for item in &self.#label { | ||||||
|                       writer.set_start_event_name(::std::option::Option::None); |                       writer.set_start_event_name(::std::option::Option::None); | ||||||
|                     writer.set_skip_start_end(true); |                     writer.set_skip_start_end(true); | ||||||
|                     ::yaserde::YaSerialize::serialize(item, writer)?; |                     ::yaserde::YaSerialize::serialize(item, writer)?; | ||||||
|                   } |                   } | ||||||
|  |                 } | ||||||
|               }) |               }) | ||||||
|             } else { |             } else { | ||||||
|               Some(quote! { |               Some(quote! { | ||||||
|  |                 #conditions { | ||||||
|                   for item in &self.#label { |                   for item in &self.#label { | ||||||
|                     writer.set_start_event_name(::std::option::Option::Some(#label_name.to_string())); |                     writer.set_start_event_name(::std::option::Option::Some(#label_name.to_string())); | ||||||
|                     writer.set_skip_start_end(false); |                     writer.set_skip_start_end(false); | ||||||
|                     ::yaserde::YaSerialize::serialize(item, writer)?; |                     ::yaserde::YaSerialize::serialize(item, writer)?; | ||||||
|                  } |                  } | ||||||
|  |                 } | ||||||
|               }) |               }) | ||||||
|             } |             } | ||||||
|             /*let (start_event, skip_start) = if field.is_flatten() {
 |             /*let (start_event, skip_start) = if field.is_flatten() {
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user