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)?;
+ }
}
})
}