From 515cec5ba7f4ca025335a47af8d55a1c3893dfc7 Mon Sep 17 00:00:00 2001 From: Marc-Antoine Arnaud Date: Mon, 6 Apr 2020 12:12:54 +0200 Subject: [PATCH] remove prefix for default namespace --- yaserde/tests/ser_namespace.rs | 23 ++++++++++++++++++++ yaserde_derive/src/ser/expand_struct.rs | 28 +++++++++++++++---------- yaserde_derive/src/ser/mod.rs | 13 +++++++----- 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/yaserde/tests/ser_namespace.rs b/yaserde/tests/ser_namespace.rs index 0314d56..b6b2717 100644 --- a/yaserde/tests/ser_namespace.rs +++ b/yaserde/tests/ser_namespace.rs @@ -182,6 +182,29 @@ fn ser_struct_default_namespace_via_attribute() { convert_and_validate!(model, content); } +#[test] +fn ser_struct_default_namespace_via_attribute_with_prefix() { + #[derive(YaSerialize, PartialEq, Debug)] + #[yaserde( + root = "tt", + prefix = "TTML", + default_namespace = "TTML", + namespace = "TTML: http://www.w3.org/ns/ttml", + namespace = "ttm: http://www.w3.org/ns/ttml#metadata" + )] + pub struct XmlStruct { + #[yaserde(prefix="TTML")] + item: String, + } + + let model = XmlStruct { + item: "something".to_string(), + }; + + let content = "something"; + convert_and_validate!(model, content); +} + #[test] fn ser_struct_namespace_nested() { #[derive(YaSerialize, Default, PartialEq, Debug)] diff --git a/yaserde_derive/src/ser/expand_struct.rs b/yaserde_derive/src/ser/expand_struct.rs index 3c94d4b..358b7bd 100644 --- a/yaserde_derive/src/ser/expand_struct.rs +++ b/yaserde_derive/src/ser/expand_struct.rs @@ -27,7 +27,7 @@ pub fn serialize( let label = &field.ident; - let label_name = build_label_name(&field, &field_attrs); + let label_name = build_label_name(&field, &field_attrs, default_namespace); get_field_type(field).and_then(|f| match f { FieldType::FieldTypeString @@ -240,7 +240,7 @@ pub fn serialize( )); } - let label_name = build_label_name(&field, &field_attrs); + let label_name = build_label_name(&field, &field_attrs, default_namespace); let conditions = condition_generator(label, &field_attrs); get_field_type(field).and_then(|f| match f { @@ -411,16 +411,22 @@ pub fn serialize( } } -fn build_label_name(field: &syn::Field, field_attrs: &YaSerdeAttribute) -> String { - format!( - "{}{}", - field_attrs - .prefix - .clone() - .map_or("".to_string(), |prefix| prefix + ":"), +fn build_label_name(field: &syn::Field, field_attrs: &YaSerdeAttribute, default_namespace: &Option) -> String { + let prefix = + if default_namespace == &field_attrs.prefix { + "".to_string() + } else { + field_attrs + .prefix + .clone() + .map_or("".to_string(), |prefix| prefix + ":") + }; + + let label = field_attrs .rename .clone() - .unwrap_or_else(|| field.ident.as_ref().unwrap().to_string()) - ) + .unwrap_or_else(|| field.ident.as_ref().unwrap().to_string()); + + format!("{}{}", prefix, label) } diff --git a/yaserde_derive/src/ser/mod.rs b/yaserde_derive/src/ser/mod.rs index d801b61..69776ba 100644 --- a/yaserde_derive/src/ser/mod.rs +++ b/yaserde_derive/src/ser/mod.rs @@ -15,11 +15,14 @@ pub fn expand_derive_serialize(ast: &syn::DeriveInput) -> Result expand_struct::serialize(