remove prefix for default namespace

This commit is contained in:
Marc-Antoine Arnaud 2020-04-06 12:12:54 +02:00
parent 7dc5ee975c
commit 515cec5ba7
3 changed files with 48 additions and 16 deletions

View File

@ -182,6 +182,29 @@ fn ser_struct_default_namespace_via_attribute() {
convert_and_validate!(model, content); 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 = "<?xml version=\"1.0\" encoding=\"utf-8\"?><tt xmlns=\"http://www.w3.org/ns/ttml\" xmlns:ttm=\"http://www.w3.org/ns/ttml#metadata\"><item>something</item></tt>";
convert_and_validate!(model, content);
}
#[test] #[test]
fn ser_struct_namespace_nested() { fn ser_struct_namespace_nested() {
#[derive(YaSerialize, Default, PartialEq, Debug)] #[derive(YaSerialize, Default, PartialEq, Debug)]

View File

@ -27,7 +27,7 @@ pub fn serialize(
let label = &field.ident; 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 { get_field_type(field).and_then(|f| match f {
FieldType::FieldTypeString 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); let conditions = condition_generator(label, &field_attrs);
get_field_type(field).and_then(|f| match f { 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 { fn build_label_name(field: &syn::Field, field_attrs: &YaSerdeAttribute, default_namespace: &Option<String>) -> String {
format!( let prefix =
"{}{}", if default_namespace == &field_attrs.prefix {
field_attrs "".to_string()
.prefix } else {
.clone() field_attrs
.map_or("".to_string(), |prefix| prefix + ":"), .prefix
.clone()
.map_or("".to_string(), |prefix| prefix + ":")
};
let label =
field_attrs field_attrs
.rename .rename
.clone() .clone()
.unwrap_or_else(|| field.ident.as_ref().unwrap().to_string()) .unwrap_or_else(|| field.ident.as_ref().unwrap().to_string());
)
format!("{}{}", prefix, label)
} }

View File

@ -15,11 +15,14 @@ pub fn expand_derive_serialize(ast: &syn::DeriveInput) -> Result<TokenStream, St
let root_attrs = attribute::YaSerdeAttribute::parse(attrs); let root_attrs = attribute::YaSerdeAttribute::parse(attrs);
let root = root_attrs.clone().root.unwrap_or_else(|| name.to_string()); let root = root_attrs.clone().root.unwrap_or_else(|| name.to_string());
let root = if let Some(prefix) = root_attrs.prefix { let prefix =
prefix + ":" + &root if root_attrs.default_namespace == root_attrs.prefix {
} else { "".to_string()
root } else {
}; root_attrs.prefix.map_or("".to_string(), |prefix| prefix + ":")
};
let root = format!("{}{}", prefix, root);
let impl_block = match *data { let impl_block = match *data {
syn::Data::Struct(ref data_struct) => expand_struct::serialize( syn::Data::Struct(ref data_struct) => expand_struct::serialize(