diff --git a/yaserde/tests/skip.rs b/yaserde/tests/skip.rs index db40266..b9879ff 100644 --- a/yaserde/tests/skip.rs +++ b/yaserde/tests/skip.rs @@ -25,3 +25,72 @@ fn skip_serializing() { let 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 = ""; + 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 = ""; + 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, + } + + let model = XmlStruct { + skipped_serializing: vec![1,2,3], + }; + + let content = ""; + serialize_and_validate!(model, content); +} + diff --git a/yaserde/tests/skip_if.rs b/yaserde/tests/skip_if.rs index 6bb7910..14d5076 100644 --- a/yaserde/tests/skip_if.rs +++ b/yaserde/tests/skip_if.rs @@ -119,3 +119,89 @@ fn skip_serializing_if_for_struct_attributes() { let 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 = ""; + 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 = ""; + 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, + } + impl XmlStruct + { + fn check_vec(&self, _child:&Vec)->bool + { + true + } + } + let model = XmlStruct { + skipped_serializing: vec![1,2,3], + }; + + let content = ""; + serialize_and_validate!(model, content); +} \ No newline at end of file diff --git a/yaserde_derive/src/ser/expand_struct.rs b/yaserde_derive/src/ser/expand_struct.rs index b407bbb..6bb5c49 100644 --- a/yaserde_derive/src/ser/expand_struct.rs +++ b/yaserde_derive/src/ser/expand_struct.rs @@ -215,18 +215,22 @@ pub fn serialize( } Field::FieldStruct { .. } => Some(if field.is_flatten() { quote! { - if let ::std::option::Option::Some(ref item) = &self.#label { - writer.set_start_event_name(::std::option::Option::None); - writer.set_skip_start_end(true); - ::yaserde::YaSerialize::serialize(item, writer)?; + #conditions { + if let ::std::option::Option::Some(ref item) = &self.#label { + writer.set_start_event_name(::std::option::Option::None); + writer.set_skip_start_end(true); + ::yaserde::YaSerialize::serialize(item, writer)?; + } } } } else { quote! { - 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_skip_start_end(false); - ::yaserde::YaSerialize::serialize(item, writer)?; + #conditions { + 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_skip_start_end(false); + ::yaserde::YaSerialize::serialize(item, writer)?; + } } } }), @@ -243,9 +247,11 @@ pub fn serialize( }; Some(quote! { - writer.set_start_event_name(#start_event); - writer.set_skip_start_end(#skip_start); - ::yaserde::YaSerialize::serialize(&self.#label, writer)?; + #conditions { + writer.set_start_event_name(#start_event); + writer.set_skip_start_end(#skip_start); + ::yaserde::YaSerialize::serialize(&self.#label, writer)?; + } }) } Field::FieldVec { data_type } => match *data_type { @@ -254,8 +260,10 @@ pub fn serialize( let inner = enclose_formatted_characters_for_value(&item_ident, label_name); Some(quote! { - for yaserde_item in &self.#label { - #inner + #conditions { + for yaserde_item in &self.#label { + #inner + } } }) } @@ -274,35 +282,43 @@ pub fn serialize( let inner = enclose_formatted_characters_for_value(&item_ident, label_name); Some(quote! { - for yaserde_item in &self.#label { - #inner + #conditions { + for yaserde_item in &self.#label { + #inner + } } }) } Field::FieldOption { .. } => Some(quote! { - for item in &self.#label { - if let Some(value) = item { - writer.set_start_event_name(None); - writer.set_skip_start_end(false); - ::yaserde::YaSerialize::serialize(value, writer)?; + #conditions { + for item in &self.#label { + if let Some(value) = item { + writer.set_start_event_name(None); + writer.set_skip_start_end(false); + ::yaserde::YaSerialize::serialize(value, writer)?; + } } } }), Field::FieldStruct { .. } => { if field.is_flatten() { Some(quote! { - for item in &self.#label { - writer.set_start_event_name(::std::option::Option::None); - writer.set_skip_start_end(true); - ::yaserde::YaSerialize::serialize(item, writer)?; + #conditions { + for item in &self.#label { + writer.set_start_event_name(::std::option::Option::None); + writer.set_skip_start_end(true); + ::yaserde::YaSerialize::serialize(item, writer)?; + } } }) } else { Some(quote! { - for item in &self.#label { - writer.set_start_event_name(::std::option::Option::Some(#label_name.to_string())); - writer.set_skip_start_end(false); - ::yaserde::YaSerialize::serialize(item, writer)?; + #conditions { + for item in &self.#label { + writer.set_start_event_name(::std::option::Option::Some(#label_name.to_string())); + writer.set_skip_start_end(false); + ::yaserde::YaSerialize::serialize(item, writer)?; + } } }) }