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(