Evaluate serialization conditions also for Struct, Vec and Enum

This commit is contained in:
Luca Benini 2022-12-28 10:42:43 +01:00
parent aa3dd831e4
commit ee04c928a4

View File

@ -215,18 +215,22 @@ pub fn serialize(
} }
Field::FieldStruct { .. } => Some(if field.is_flatten() { Field::FieldStruct { .. } => Some(if field.is_flatten() {
quote! { quote! {
if let ::std::option::Option::Some(ref item) = &self.#label { #conditions {
writer.set_start_event_name(::std::option::Option::None); if let ::std::option::Option::Some(ref item) = &self.#label {
writer.set_skip_start_end(true); writer.set_start_event_name(::std::option::Option::None);
::yaserde::YaSerialize::serialize(item, writer)?; writer.set_skip_start_end(true);
::yaserde::YaSerialize::serialize(item, writer)?;
}
} }
} }
} else { } else {
quote! { quote! {
if let ::std::option::Option::Some(ref item) = &self.#label { #conditions {
writer.set_start_event_name(::std::option::Option::Some(#label_name.to_string())); if let ::std::option::Option::Some(ref item) = &self.#label {
writer.set_skip_start_end(false); writer.set_start_event_name(::std::option::Option::Some(#label_name.to_string()));
::yaserde::YaSerialize::serialize(item, writer)?; writer.set_skip_start_end(false);
::yaserde::YaSerialize::serialize(item, writer)?;
}
} }
} }
}), }),
@ -243,9 +247,11 @@ pub fn serialize(
}; };
Some(quote! { Some(quote! {
writer.set_start_event_name(#start_event); #conditions {
writer.set_skip_start_end(#skip_start); writer.set_start_event_name(#start_event);
::yaserde::YaSerialize::serialize(&self.#label, writer)?; writer.set_skip_start_end(#skip_start);
::yaserde::YaSerialize::serialize(&self.#label, writer)?;
}
}) })
} }
Field::FieldVec { data_type } => match *data_type { 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); let inner = enclose_formatted_characters_for_value(&item_ident, label_name);
Some(quote! { Some(quote! {
for yaserde_item in &self.#label { #conditions {
#inner 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); let inner = enclose_formatted_characters_for_value(&item_ident, label_name);
Some(quote! { Some(quote! {
for yaserde_item in &self.#label { #conditions {
#inner for yaserde_item in &self.#label {
#inner
}
} }
}) })
} }
Field::FieldOption { .. } => Some(quote! { Field::FieldOption { .. } => Some(quote! {
for item in &self.#label { #conditions {
if let Some(value) = item { for item in &self.#label {
writer.set_start_event_name(None); if let Some(value) = item {
writer.set_skip_start_end(false); writer.set_start_event_name(None);
::yaserde::YaSerialize::serialize(value, writer)?; writer.set_skip_start_end(false);
::yaserde::YaSerialize::serialize(value, writer)?;
}
} }
} }
}), }),
Field::FieldStruct { .. } => { Field::FieldStruct { .. } => {
if field.is_flatten() { if field.is_flatten() {
Some(quote! { Some(quote! {
for item in &self.#label { #conditions {
writer.set_start_event_name(::std::option::Option::None); for item in &self.#label {
writer.set_skip_start_end(true); writer.set_start_event_name(::std::option::Option::None);
::yaserde::YaSerialize::serialize(item, writer)?; writer.set_skip_start_end(true);
::yaserde::YaSerialize::serialize(item, writer)?;
}
} }
}) })
} else { } else {
Some(quote! { Some(quote! {
for item in &self.#label { #conditions {
writer.set_start_event_name(::std::option::Option::Some(#label_name.to_string())); for item in &self.#label {
writer.set_skip_start_end(false); writer.set_start_event_name(::std::option::Option::Some(#label_name.to_string()));
::yaserde::YaSerialize::serialize(item, writer)?; writer.set_skip_start_end(false);
::yaserde::YaSerialize::serialize(item, writer)?;
}
} }
}) })
} }