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 { | ||||||
|  |       "".to_string() | ||||||
|  |     } else { | ||||||
|       field_attrs |       field_attrs | ||||||
|         .prefix |         .prefix | ||||||
|         .clone() |         .clone() | ||||||
|       .map_or("".to_string(), |prefix| prefix + ":"), |         .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,12 +15,15 @@ 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 { | ||||||
|  |       "".to_string() | ||||||
|     } else { |     } else { | ||||||
|     root |       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( | ||||||
|       data_struct, |       data_struct, | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user