diff --git a/yaserde/tests/serializer.rs b/yaserde/tests/serializer.rs index 7b8cf6f..ab615ef 100644 --- a/yaserde/tests/serializer.rs +++ b/yaserde/tests/serializer.rs @@ -63,6 +63,72 @@ fn ser_list_of_items() { 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); + + #[derive(YaSerialize, PartialEq, Debug)] + #[yaserde(rename = "base")] + pub struct XmlStructOfStructNonFlattenedField { + //#[yaserde(flatten)] + items: Vec, + } + + let model3 = XmlStructOfStructNonFlattenedField { + items: vec![ + SubStruct { + field: "something1".to_string(), + }, + SubStruct { + field: "something2".to_string(), + }, + ], + }; + + 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 a92c16d..dcd6379 100644 --- a/yaserde_derive/src/ser/expand_struct.rs +++ b/yaserde_derive/src/ser/expand_struct.rs @@ -267,13 +267,36 @@ pub fn serialize( } } }), - Field::FieldStruct { .. } => Some(quote! { - for item in &self.#label { - writer.set_start_event_name(None); - writer.set_skip_start_end(false); - item.serialize(writer)?; + Field::FieldStruct { .. } => { + 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)?; + })*/ + } Field::FieldVec { .. } => { unimplemented!(); }