remove prefix for default namespace
This commit is contained in:
parent
7dc5ee975c
commit
515cec5ba7
@ -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)]
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user