diff --git a/yaserde/tests/enum.rs b/yaserde/tests/enum.rs index dd2e5fa..74de022 100644 --- a/yaserde/tests/enum.rs +++ b/yaserde/tests/enum.rs @@ -362,6 +362,7 @@ fn unnamed_enum() { fn tagged_enum() { #[derive(Debug, PartialEq, YaSerialize, YaDeserialize, Default)] #[yaserde(tag = "type")] + #[yaserde(rename = "foobar")] enum XmlEnum { #[default] #[yaserde(rename = "foo")] @@ -371,25 +372,26 @@ fn tagged_enum() { } #[derive(Debug, PartialEq, YaSerialize, YaDeserialize, Default)] + #[yaserde(rename = "base")] struct XmlStruct { #[yaserde(rename = "foobar")] foo_bar: XmlEnum, } let model = XmlEnum::Foo; - let content = ""; - // serialize_and_validate!(model, content); + let content = ""; + serialize_and_validate!(model, content); deserialize_and_validate!(content, model, XmlEnum); let model = XmlEnum::Bar; - let content = ""; - // serialize_and_validate!(model, content); + let content = ""; + serialize_and_validate!(model, content); deserialize_and_validate!(content, model, XmlEnum); let model = XmlStruct { foo_bar: XmlEnum::Foo, }; - let content = ""; - // serialize_and_validate!(model, content); + let content = ""; + serialize_and_validate!(model, content); deserialize_and_validate!(content, model, XmlStruct); } diff --git a/yaserde_derive/src/ser/expand_enum.rs b/yaserde_derive/src/ser/expand_enum.rs index 56eed3a..3ef0bed 100644 --- a/yaserde_derive/src/ser/expand_enum.rs +++ b/yaserde_derive/src/ser/expand_enum.rs @@ -26,6 +26,21 @@ pub fn serialize( .map(|variant| -> TokenStream { let _attrs = crate::common::YaSerdeAttribute::parse(&variant.attrs); + let add_tag = if let Some(tag) = &root_attributes.tag { + let attrs = crate::common::YaSerdeAttribute::parse(&variant.attrs); + let label = variant.ident.clone(); + let element_name = attrs.xml_element_name(&variant.ident); + quote! { + match self { + #name::#label { .. } => { + let tag = ::yaserde::__xml::name::OwnedName::local(#tag); + child_attributes.push(::yaserde::__xml::attribute::OwnedAttribute::new(tag, #element_name)); + } + _ => {} + } + } + } else { quote!() }; + let all_fields = variant .fields .iter() @@ -39,7 +54,7 @@ pub fn serialize( }) .collect(); - attribute_fields + let add_attributes : TokenStream = attribute_fields .iter() .map(|field| { let label = variant.ident.clone(); @@ -79,7 +94,9 @@ pub fn serialize( } } }) - .collect() + .collect(); + + quote!( #add_attributes #add_tag) }) .collect(); @@ -109,10 +126,16 @@ fn inner_enum_inspector( let label_name = build_label_name(label, &variant_attrs, &root_attributes.default_namespace); match variant.fields { - Fields::Unit => quote! { - &#name::#label => { - let data_event = ::yaserde::__xml::writer::XmlEvent::characters(#label_name); - writer.write(data_event).map_err(|e| e.to_string())?; + Fields::Unit => { + if let Some(_tag) = &root_attributes.tag { + quote! { #name::#label => {} } + } else { + quote! { + #name::#label => { + let data_event = ::yaserde::__xml::writer::XmlEvent::characters(#label_name); + writer.write(data_event).map_err(|e| e.to_string())?; + } + } } }, Fields::Named(ref fields) => {