From f1c78186566d7aa986073c28da99b8d3b8585ed9 Mon Sep 17 00:00:00 2001 From: Dmitry Samoylov Date: Mon, 20 Jan 2020 17:55:51 +0700 Subject: [PATCH] Fix unnamed enum variants serialized ignoring namespace prefix --- yaserde/tests/se_namespace.rs | 7 +++++++ yaserde_derive/src/ser/expand_enum.rs | 21 +++++++++------------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/yaserde/tests/se_namespace.rs b/yaserde/tests/se_namespace.rs index d046569..14453d6 100644 --- a/yaserde/tests/se_namespace.rs +++ b/yaserde/tests/se_namespace.rs @@ -47,12 +47,19 @@ fn ser_enum_namespace() { pub enum XmlStruct { #[yaserde(prefix = "ns")] Item, + #[yaserde(prefix = "ns")] + ItemWithField(String), } let model = XmlStruct::Item; let content = "ns:Item"; convert_and_validate!(model, content); + + let model = XmlStruct::ItemWithField("Value".to_string()); + + let content = "Value"; + convert_and_validate!(model, content); } #[test] diff --git a/yaserde_derive/src/ser/expand_enum.rs b/yaserde_derive/src/ser/expand_enum.rs index c1eedc6..f61e40f 100644 --- a/yaserde_derive/src/ser/expand_enum.rs +++ b/yaserde_derive/src/ser/expand_enum.rs @@ -17,16 +17,15 @@ pub fn serialize( .variants .iter() .map(|variant| { - let variant_attrs = YaSerdeAttribute::parse(&variant.attrs); - let renamed_label = match variant_attrs.rename { - Some(value) => Ident::new(&value, Span::call_site()), - None => variant.ident.clone(), - }; let label = &variant.ident; - let label_name = if let Some(prefix) = variant_attrs.prefix { - prefix + ":" + renamed_label.to_string().as_ref() - } else { - renamed_label.to_string() + let label_name = { + let variant_attrs = YaSerdeAttribute::parse(&variant.attrs); + let prefix = variant_attrs.prefix.map_or(String::new(), |p| p + ":"); + let renamed_label = variant_attrs + .rename + .unwrap_or_else(|| variant.ident.to_string()); + + prefix + renamed_label.as_str() }; match variant.fields { @@ -124,11 +123,9 @@ pub fn serialize( return None; } - let field_label_name = renamed_label.to_string(); - let write_element = |action: &TokenStream| { quote! { - let struct_start_event = XmlEvent::start_element(#field_label_name); + let struct_start_event = XmlEvent::start_element(#label_name); let _ret = writer.write(struct_start_event); #action