Allow struct fields be named as 'name' (issue #21)
This commit is contained in:
		
							parent
							
								
									2a3716c828
								
							
						
					
					
						commit
						85f461573b
					
				| @ -350,3 +350,21 @@ fn de_attribute_enum() { | |||||||
|     } |     } | ||||||
|   ); |   ); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | #[test] | ||||||
|  | fn de_name_issue_21() { | ||||||
|  |   #[derive(YaDeserialize, PartialEq, Debug)] | ||||||
|  |   #[yaserde(root = "book")] | ||||||
|  |   pub struct Book { | ||||||
|  |     name: String, | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   let content = "<book><name>Little prince</name></book>"; | ||||||
|  |   convert_and_validate!( | ||||||
|  |     content, | ||||||
|  |     Book, | ||||||
|  |     Book { | ||||||
|  |       name: String::from("Little prince"), | ||||||
|  |     } | ||||||
|  |   ); | ||||||
|  | } | ||||||
|  | |||||||
| @ -298,3 +298,19 @@ fn ser_attribute_enum() { | |||||||
|   let content = "<?xml version=\"1.0\" encoding=\"utf-8\"?><base color=\"pink\" />"; |   let content = "<?xml version=\"1.0\" encoding=\"utf-8\"?><base color=\"pink\" />"; | ||||||
|   convert_and_validate!(model, content); |   convert_and_validate!(model, content); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | #[test] | ||||||
|  | fn ser_name_issue_21() { | ||||||
|  |   #[derive(YaSerialize, PartialEq, Debug)] | ||||||
|  |   #[yaserde(root = "base")] | ||||||
|  |   pub struct XmlStruct { | ||||||
|  |     name: String, | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   let model = XmlStruct { | ||||||
|  |     name: "something".to_string(), | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   let content = "<?xml version=\"1.0\" encoding=\"utf-8\"?><base><name>something</name></base>"; | ||||||
|  |   convert_and_validate!(model, content); | ||||||
|  | } | ||||||
|  | |||||||
| @ -35,7 +35,7 @@ pub fn parse( | |||||||
|     .fields |     .fields | ||||||
|     .iter() |     .iter() | ||||||
|     .map(|field| { |     .map(|field| { | ||||||
|       let label = &field.ident; |       let label = &get_value_label(&field.ident); | ||||||
|       let field_attrs = YaSerdeAttribute::parse(&field.attrs); |       let field_attrs = YaSerdeAttribute::parse(&field.attrs); | ||||||
| 
 | 
 | ||||||
|       match get_field_type(field) { |       match get_field_type(field) { | ||||||
| @ -401,6 +401,7 @@ pub fn parse( | |||||||
|     .map(|field| { |     .map(|field| { | ||||||
|       let field_attrs = YaSerdeAttribute::parse(&field.attrs); |       let field_attrs = YaSerdeAttribute::parse(&field.attrs); | ||||||
|       let label = &field.ident; |       let label = &field.ident; | ||||||
|  |       let value_label = &get_value_label(&field.ident); | ||||||
| 
 | 
 | ||||||
|       if field_attrs.attribute { |       if field_attrs.attribute { | ||||||
|         return None; |         return None; | ||||||
| @ -550,7 +551,7 @@ pub fn parse( | |||||||
|             reader.set_map_value(); |             reader.set_map_value(); | ||||||
|             match #struct_name::deserialize(reader) { |             match #struct_name::deserialize(reader) { | ||||||
|               Ok(parsed_item) => { |               Ok(parsed_item) => { | ||||||
|                 #label = parsed_item; |                 #value_label = parsed_item; | ||||||
|                 let _root = reader.next_event(); |                 let _root = reader.next_event(); | ||||||
|               }, |               }, | ||||||
|               Err(msg) => { |               Err(msg) => { | ||||||
| @ -704,7 +705,7 @@ pub fn parse( | |||||||
|                   reader.set_map_value(); |                   reader.set_map_value(); | ||||||
|                   match #struct_ident::deserialize(reader) { |                   match #struct_ident::deserialize(reader) { | ||||||
|                     Ok(parsed_item) => { |                     Ok(parsed_item) => { | ||||||
|                       #label = Some(parsed_item); |                       #value_label = Some(parsed_item); | ||||||
|                       let _root = reader.next_event(); |                       let _root = reader.next_event(); | ||||||
|                     }, |                     }, | ||||||
|                     Err(msg) => { |                     Err(msg) => { | ||||||
| @ -862,7 +863,7 @@ pub fn parse( | |||||||
|                   reader.set_map_value(); |                   reader.set_map_value(); | ||||||
|                   match #struct_ident::deserialize(reader) { |                   match #struct_ident::deserialize(reader) { | ||||||
|                     Ok(parsed_item) => { |                     Ok(parsed_item) => { | ||||||
|                       #label.push(parsed_item); |                       #value_label.push(parsed_item); | ||||||
|                       let _root = reader.next_event(); |                       let _root = reader.next_event(); | ||||||
|                     }, |                     }, | ||||||
|                     Err(msg) => { |                     Err(msg) => { | ||||||
| @ -894,7 +895,7 @@ pub fn parse( | |||||||
|         return None; |         return None; | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       let label = &field.ident; |       let label = &get_value_label(&field.ident); | ||||||
|       let label_name = if let Some(value) = field_attrs.rename { |       let label_name = if let Some(value) = field_attrs.rename { | ||||||
|         Ident::new(&value.to_string(), Span::call_site()).to_string() |         Ident::new(&value.to_string(), Span::call_site()).to_string() | ||||||
|       } else { |       } else { | ||||||
| @ -1114,7 +1115,7 @@ pub fn parse( | |||||||
|     .fields |     .fields | ||||||
|     .iter() |     .iter() | ||||||
|     .map(|field| { |     .map(|field| { | ||||||
|       let label = &field.ident; |       let label = &get_value_label(&field.ident); | ||||||
|       let field_attrs = YaSerdeAttribute::parse(&field.attrs); |       let field_attrs = YaSerdeAttribute::parse(&field.attrs); | ||||||
| 
 | 
 | ||||||
|       match get_field_type(field) { |       match get_field_type(field) { | ||||||
| @ -1195,10 +1196,11 @@ pub fn parse( | |||||||
|     .iter() |     .iter() | ||||||
|     .map(|field| { |     .map(|field| { | ||||||
|       let label = &field.ident; |       let label = &field.ident; | ||||||
|  |       let value_label = &get_value_label(&field.ident); | ||||||
| 
 | 
 | ||||||
|       if get_field_type(field).is_some() { |       if get_field_type(field).is_some() { | ||||||
|         Some(quote! { |         Some(quote! { | ||||||
|           #label: #label, |           #label: #value_label, | ||||||
|         }) |         }) | ||||||
|       } else { |       } else { | ||||||
|         None |         None | ||||||
| @ -1307,6 +1309,7 @@ fn build_call_visitor( | |||||||
|   let prefix = field_attrs.prefix.clone(); |   let prefix = field_attrs.prefix.clone(); | ||||||
| 
 | 
 | ||||||
|   // let label = &field.ident;
 |   // let label = &field.ident;
 | ||||||
|  |   let value_label = get_value_label(label); | ||||||
|   let label_name = if let Some(ref value) = field_attrs.rename { |   let label_name = if let Some(ref value) = field_attrs.rename { | ||||||
|     Ident::new(&value.to_string(), Span::call_site()).to_string() |     Ident::new(&value.to_string(), Span::call_site()).to_string() | ||||||
|   } else { |   } else { | ||||||
| @ -1361,7 +1364,7 @@ fn build_call_visitor( | |||||||
|       }); |       }); | ||||||
| 
 | 
 | ||||||
|       if let Ok(value) = result { |       if let Ok(value) = result { | ||||||
|         #label#action |         #value_label#action | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   }) |   }) | ||||||
| @ -1400,3 +1403,13 @@ fn build_set_text_to_value( | |||||||
|     None |     None | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | fn get_value_label(ident: &Option<syn::Ident>) -> Option<syn::Ident> { | ||||||
|  |   match &ident { | ||||||
|  |     Some(ident) => Some(syn::Ident::new( | ||||||
|  |       &format!("__{}_value", ident.to_string()), | ||||||
|  |       ident.span(), | ||||||
|  |     )), | ||||||
|  |     None => None, | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user