Merge pull request #153 from lbenini/skip-fixes

skip/skip_if are not working for Enum, Struct and Vec
This commit is contained in:
Marc-Antoine ARNAUD 2023-01-03 22:49:52 +01:00 committed by GitHub
commit 8483c3be79
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 199 additions and 28 deletions

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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() {