From b1d11f4e3a97017a7efee39370e8ad08986264f2 Mon Sep 17 00:00:00 2001 From: Horaci Macias Date: Fri, 17 Jul 2020 12:37:51 +0200 Subject: [PATCH 1/5] Trying to address https://github.com/media-io/yaserde/issues/63 --- yaserde/tests/serializer.rs | 25 +++++++++++++++++++++++-- yaserde_derive/src/ser/expand_struct.rs | 2 +- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/yaserde/tests/serializer.rs b/yaserde/tests/serializer.rs index 7b8cf6f..4699604 100644 --- a/yaserde/tests/serializer.rs +++ b/yaserde/tests/serializer.rs @@ -60,9 +60,30 @@ fn ser_list_of_items() { ], }; - let content = - "something1something2"; + let content = "something1something2"; serialize_and_validate!(model2, content); + + #[derive(YaSerialize, PartialEq, Debug)] + #[yaserde(rename = "base")] + pub struct XmlStructOfStructRenamedField { + #[yaserde(rename = "listField")] + items: Vec, + } + + let model3 = XmlStructOfStructRenamedField { + items: vec![ + SubStruct { + field: "something1".to_string(), + }, + SubStruct { + field: "something2".to_string(), + }, + ], + }; + + // SubStruct has 'rename' set, but it's ignored because SubStruct is used as a field of XmlStructOfStructRenamedField that overrides the 'rename + let content = "something1something2"; + serialize_and_validate!(model3, content); } #[test] diff --git a/yaserde_derive/src/ser/expand_struct.rs b/yaserde_derive/src/ser/expand_struct.rs index a92c16d..7931b6b 100644 --- a/yaserde_derive/src/ser/expand_struct.rs +++ b/yaserde_derive/src/ser/expand_struct.rs @@ -269,7 +269,7 @@ pub fn serialize( }), Field::FieldStruct { .. } => Some(quote! { for item in &self.#label { - writer.set_start_event_name(None); + writer.set_start_event_name(Some(#label_name.to_string())); writer.set_skip_start_end(false); item.serialize(writer)?; } From 10e02eb5557eb6acf2eb1952408f460ddf5efbae Mon Sep 17 00:00:00 2001 From: Horaci Macias Date: Mon, 20 Jul 2020 17:35:07 +0200 Subject: [PATCH 2/5] Trying to fix tabs --- yaserde/tests/serializer.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/yaserde/tests/serializer.rs b/yaserde/tests/serializer.rs index 4699604..9d5e102 100644 --- a/yaserde/tests/serializer.rs +++ b/yaserde/tests/serializer.rs @@ -60,14 +60,15 @@ fn ser_list_of_items() { ], }; - let content = "something1something2"; + let content = + "something1something2"; serialize_and_validate!(model2, content); #[derive(YaSerialize, PartialEq, Debug)] #[yaserde(rename = "base")] pub struct XmlStructOfStructRenamedField { - #[yaserde(rename = "listField")] - items: Vec, + #[yaserde(rename = "listField")] + items: Vec, } let model3 = XmlStructOfStructRenamedField { From c76ad9fe592506f4e3ffc357e1307720a0073087 Mon Sep 17 00:00:00 2001 From: Horaci Macias Date: Tue, 21 Jul 2020 09:11:59 +0200 Subject: [PATCH 3/5] Working on flatten --- yaserde/tests/serializer.rs | 23 +++++++++++++++++++++++ yaserde_derive/src/ser/expand_struct.rs | 18 ++++++++++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/yaserde/tests/serializer.rs b/yaserde/tests/serializer.rs index 9d5e102..174e5c0 100644 --- a/yaserde/tests/serializer.rs +++ b/yaserde/tests/serializer.rs @@ -85,6 +85,29 @@ fn ser_list_of_items() { // SubStruct has 'rename' set, but it's ignored because SubStruct is used as a field of XmlStructOfStructRenamedField that overrides the 'rename let content = "something1something2"; serialize_and_validate!(model3, content); + + #[derive(YaSerialize, PartialEq, Debug)] + #[yaserde(rename = "base")] + pub struct XmlStructOfStructRenamedFlattenedField { + //#[yaserde(flatten)] + items: Vec, + } + + let model3 = XmlStructOfStructRenamedFlattenedField { + items: vec![ + SubStruct { + field: "something1".to_string(), + }, + SubStruct { + field: "something2".to_string(), + }, + ], + }; + + // SubStruct has 'rename' set, but it's ignored because SubStruct is used as a field of XmlStructOfStructRenamedFlattenedField that overrides the 'rename + let content = "something1something2"; + //let content = "something1something2"; + serialize_and_validate!(model3, content); } #[test] diff --git a/yaserde_derive/src/ser/expand_struct.rs b/yaserde_derive/src/ser/expand_struct.rs index 7931b6b..07df01b 100644 --- a/yaserde_derive/src/ser/expand_struct.rs +++ b/yaserde_derive/src/ser/expand_struct.rs @@ -267,13 +267,27 @@ pub fn serialize( } } }), - Field::FieldStruct { .. } => Some(quote! { + Field::FieldStruct { .. } => { + Some(quote! { + //&self.#label for item in &self.#label { writer.set_start_event_name(Some(#label_name.to_string())); writer.set_skip_start_end(false); item.serialize(writer)?; } - }), + }) +// let (start_event, skip_start) = if field.is_flatten() { +// (quote!(None), true) +// } else { +// (quote!(Some(#label_name.to_string())), false) +// }; +// +// Some(quote! { +// writer.set_start_event_name(#start_event); +// writer.set_skip_start_end(#skip_start); +// self.#label.serialize(writer)?; +// }) + }, Field::FieldVec { .. } => { unimplemented!(); } From c2d9a9fb64176278e0533186e5beda510ec2337a Mon Sep 17 00:00:00 2001 From: Horaci Macias Date: Tue, 21 Jul 2020 09:36:55 +0200 Subject: [PATCH 4/5] Before formatting --- yaserde/tests/serializer.rs | 28 ++++++++++++--- yaserde_derive/src/ser/expand_struct.rs | 47 +++++++++++++++---------- 2 files changed, 52 insertions(+), 23 deletions(-) diff --git a/yaserde/tests/serializer.rs b/yaserde/tests/serializer.rs index 174e5c0..dfed572 100644 --- a/yaserde/tests/serializer.rs +++ b/yaserde/tests/serializer.rs @@ -88,12 +88,12 @@ fn ser_list_of_items() { #[derive(YaSerialize, PartialEq, Debug)] #[yaserde(rename = "base")] - pub struct XmlStructOfStructRenamedFlattenedField { + pub struct XmlStructOfStructNonFlattenedField { //#[yaserde(flatten)] items: Vec, } - let model3 = XmlStructOfStructRenamedFlattenedField { + let model3 = XmlStructOfStructNonFlattenedField { items: vec![ SubStruct { field: "something1".to_string(), @@ -104,10 +104,30 @@ fn ser_list_of_items() { ], }; - // SubStruct has 'rename' set, but it's ignored because SubStruct is used as a field of XmlStructOfStructRenamedFlattenedField that overrides the 'rename let content = "something1something2"; - //let content = "something1something2"; serialize_and_validate!(model3, content); + + #[derive(YaSerialize, PartialEq, Debug)] + #[yaserde(rename = "base")] + pub struct XmlStructOfStructFlattenedField { + #[yaserde(flatten)] + items: Vec, + } + + let model3 = XmlStructOfStructFlattenedField { + items: vec![ + SubStruct { + field: "something1".to_string(), + }, + SubStruct { + field: "something2".to_string(), + }, + ], + }; + + // SubStruct has 'rename' set, but it's ignored because SubStruct is used as a field of XmlStructOfStructRenamedFlattenedField that overrides the 'rename + let content = "something1something2"; + serialize_and_validate!(model3, content); } #[test] diff --git a/yaserde_derive/src/ser/expand_struct.rs b/yaserde_derive/src/ser/expand_struct.rs index 07df01b..dcd6379 100644 --- a/yaserde_derive/src/ser/expand_struct.rs +++ b/yaserde_derive/src/ser/expand_struct.rs @@ -268,26 +268,35 @@ pub fn serialize( } }), Field::FieldStruct { .. } => { - Some(quote! { - //&self.#label - for item in &self.#label { - writer.set_start_event_name(Some(#label_name.to_string())); - writer.set_skip_start_end(false); - item.serialize(writer)?; + if field.is_flatten() { + Some(quote! { + for item in &self.#label { + writer.set_start_event_name(None); + writer.set_skip_start_end(true); + item.serialize(writer)?; + } + }) + } else { + Some(quote! { + for item in &self.#label { + writer.set_start_event_name(Some(#label_name.to_string())); + writer.set_skip_start_end(false); + item.serialize(writer)?; + } + }) } - }) -// let (start_event, skip_start) = if field.is_flatten() { -// (quote!(None), true) -// } else { -// (quote!(Some(#label_name.to_string())), false) -// }; -// -// Some(quote! { -// writer.set_start_event_name(#start_event); -// writer.set_skip_start_end(#skip_start); -// self.#label.serialize(writer)?; -// }) - }, + /*let (start_event, skip_start) = if field.is_flatten() { + (quote!(None), true) + } else { + (quote!(Some(#label_name.to_string())), false) + }; + + Some(quote! { + writer.set_start_event_name(#start_event); + writer.set_skip_start_end(#skip_start); + self.#label.serialize(writer)?; + })*/ + } Field::FieldVec { .. } => { unimplemented!(); } From 974ff0ee1a3c022adfd2189306489776e896fce5 Mon Sep 17 00:00:00 2001 From: Horaci Macias Date: Tue, 21 Jul 2020 09:37:29 +0200 Subject: [PATCH 5/5] formatted --- yaserde/tests/serializer.rs | 39 +++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/yaserde/tests/serializer.rs b/yaserde/tests/serializer.rs index dfed572..ab615ef 100644 --- a/yaserde/tests/serializer.rs +++ b/yaserde/tests/serializer.rs @@ -104,30 +104,31 @@ fn ser_list_of_items() { ], }; - let content = "something1something2"; + let content = + "something1something2"; serialize_and_validate!(model3, content); #[derive(YaSerialize, PartialEq, Debug)] - #[yaserde(rename = "base")] - pub struct XmlStructOfStructFlattenedField { - #[yaserde(flatten)] - items: Vec, - } + #[yaserde(rename = "base")] + pub struct XmlStructOfStructFlattenedField { + #[yaserde(flatten)] + items: Vec, + } - let model3 = XmlStructOfStructFlattenedField { - items: vec![ - SubStruct { - field: "something1".to_string(), - }, - SubStruct { - field: "something2".to_string(), - }, - ], - }; + let model3 = XmlStructOfStructFlattenedField { + items: vec![ + SubStruct { + field: "something1".to_string(), + }, + SubStruct { + field: "something2".to_string(), + }, + ], + }; - // SubStruct has 'rename' set, but it's ignored because SubStruct is used as a field of XmlStructOfStructRenamedFlattenedField that overrides the 'rename - let content = "something1something2"; - serialize_and_validate!(model3, content); + // SubStruct has 'rename' set, but it's ignored because SubStruct is used as a field of XmlStructOfStructRenamedFlattenedField that overrides the 'rename + let content = "something1something2"; + serialize_and_validate!(model3, content); } #[test]