Fix compilation errors when element name contains dots
This commit is contained in:
		
							parent
							
								
									6bbb9676d0
								
							
						
					
					
						commit
						688ab0b160
					
				| @ -181,6 +181,8 @@ fn de_rename() { | ||||
|     item: String, | ||||
|     #[yaserde(rename = "sub")] | ||||
|     sub_struct: SubStruct, | ||||
|     #[yaserde(rename = "maj.min.bug")] | ||||
|     with_dots: String, | ||||
|   } | ||||
| 
 | ||||
|   #[derive(YaDeserialize, PartialEq, Debug)] | ||||
| @ -198,7 +200,7 @@ fn de_rename() { | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   let content = "<base Item=\"something\"><sub sub_item=\"sub_something\"></sub></base>"; | ||||
|   let content = "<base Item=\"something\"><sub sub_item=\"sub_something\"></sub><maj.min.bug>2.0.1</maj.min.bug></base>"; | ||||
|   convert_and_validate!( | ||||
|     content, | ||||
|     XmlStruct, | ||||
| @ -207,6 +209,7 @@ fn de_rename() { | ||||
|       sub_struct: SubStruct { | ||||
|         subitem: "sub_something".to_string(), | ||||
|       }, | ||||
|       with_dots: "2.0.1".into() | ||||
|     } | ||||
|   ); | ||||
| } | ||||
| @ -378,6 +381,8 @@ fn de_complex_enum() { | ||||
|     Magenta(Vec<OtherStruct>), | ||||
|     #[yaserde(rename = "NotSoCyan")] | ||||
|     Cyan(Vec<OtherStruct>), | ||||
|     #[yaserde(rename = "renamed.with.dots")] | ||||
|     Dotted(u32), | ||||
|   } | ||||
| 
 | ||||
|   impl Default for Color { | ||||
| @ -551,6 +556,21 @@ fn de_complex_enum() { | ||||
|       ]) | ||||
|     } | ||||
|   ); | ||||
| 
 | ||||
|   let content = r#"<?xml version="1.0" encoding="utf-8"?>
 | ||||
|     <base xmlns:ns="http://www.sample.com/ns/domain"> | ||||
|       <background> | ||||
|         <renamed.with.dots>54</renamed.with.dots> | ||||
|       </background> | ||||
|     </base> | ||||
|   "#;
 | ||||
|   convert_and_validate!( | ||||
|     content, | ||||
|     XmlStruct, | ||||
|     XmlStruct { | ||||
|       background: Color::Dotted(54) | ||||
|     } | ||||
|   ); | ||||
| } | ||||
| 
 | ||||
| #[test] | ||||
|  | ||||
| @ -125,6 +125,8 @@ fn ser_rename() { | ||||
|     item: String, | ||||
|     #[yaserde(rename = "sub")] | ||||
|     sub_struct: SubStruct, | ||||
|     #[yaserde(rename = "maj.min.bug")] | ||||
|     version: String, | ||||
|   } | ||||
| 
 | ||||
|   #[derive(YaSerialize, PartialEq, Debug)] | ||||
| @ -154,9 +156,10 @@ fn ser_rename() { | ||||
|     sub_struct: SubStruct { | ||||
|       subitem: "sub_something".to_string(), | ||||
|     }, | ||||
|     version: "2.0.2".into(), | ||||
|   }; | ||||
| 
 | ||||
|   let content = "<?xml version=\"1.0\" encoding=\"utf-8\"?><base Item=\"something\"><sub sub_item=\"sub_something\" /></base>"; | ||||
|   let content = "<?xml version=\"1.0\" encoding=\"utf-8\"?><base Item=\"something\"><sub sub_item=\"sub_something\" /><maj.min.bug>2.0.2</maj.min.bug></base>"; | ||||
|   convert_and_validate!(model, content); | ||||
| } | ||||
| 
 | ||||
| @ -326,6 +329,8 @@ fn ser_unnamed_enum() { | ||||
|     Structs(Vec<OtherStruct>), | ||||
|     #[yaserde(rename = "renamed")] | ||||
|     ToRename(u32), | ||||
|     #[yaserde(rename = "renamed.with.dots")] | ||||
|     ToRenameDots(u32), | ||||
|   } | ||||
| 
 | ||||
|   impl Default for Enum { | ||||
| @ -422,6 +427,14 @@ fn ser_unnamed_enum() { | ||||
|   let content = | ||||
|     "<?xml version=\"1.0\" encoding=\"utf-8\"?><base><color><renamed>87</renamed></color></base>"; | ||||
|   convert_and_validate!(model, content); | ||||
| 
 | ||||
|   let model = XmlStruct { | ||||
|     color: Enum::ToRenameDots(84), | ||||
|   }; | ||||
| 
 | ||||
|   let content = | ||||
|     "<?xml version=\"1.0\" encoding=\"utf-8\"?><base><color><renamed.with.dots>84</renamed.with.dots></color></base>"; | ||||
|   convert_and_validate!(model, content); | ||||
| } | ||||
| 
 | ||||
| #[test] | ||||
|  | ||||
| @ -207,7 +207,7 @@ pub fn parse( | ||||
|         .rename | ||||
|         .unwrap_or_else(|| field.ident.as_ref().unwrap().to_string()); | ||||
| 
 | ||||
|       let visitor_label = Ident::new(&format!("__Visitor{}", label_name), Span::call_site()); | ||||
|       let visitor_label = build_visitor_ident(&label_name, None); | ||||
| 
 | ||||
|       match get_field_type(field) { | ||||
|         Some(FieldType::FieldTypeString) => { | ||||
| @ -252,10 +252,7 @@ pub fn parse( | ||||
|             .iter() | ||||
|             .map(|s| s.ident.to_string()) | ||||
|             .collect(); | ||||
|           let struct_ident = Ident::new( | ||||
|             &format!("__Visitor_{}_{}", label_name, struct_id), | ||||
|             Span::call_site(), | ||||
|           ); | ||||
|           let struct_ident = build_visitor_ident(&label_name, Some(&struct_id)); | ||||
| 
 | ||||
|           Some(quote! { | ||||
|             #[allow(non_snake_case, non_camel_case_types)] | ||||
| @ -405,11 +402,10 @@ pub fn parse( | ||||
|         return None; | ||||
|       } | ||||
| 
 | ||||
|       let label_name = if let Some(ref value) = field_attrs.rename { | ||||
|         Ident::new(&value.to_string(), Span::call_site()).to_string() | ||||
|       } else { | ||||
|         field.ident.clone().unwrap().to_string() | ||||
|       }; | ||||
|       let label_name = field_attrs | ||||
|         .rename | ||||
|         .clone() | ||||
|         .unwrap_or_else(|| label.as_ref().unwrap().to_string()); | ||||
| 
 | ||||
|       match get_field_type(field) { | ||||
|         Some(FieldType::FieldTypeString) => { | ||||
| @ -899,7 +895,7 @@ pub fn parse( | ||||
|         .rename | ||||
|         .unwrap_or_else(|| field.ident.as_ref().unwrap().to_string()); | ||||
| 
 | ||||
|       let visitor_label = Ident::new(&format!("__Visitor{}", label_name), Span::call_site()); | ||||
|       let visitor_label = build_visitor_ident(&label_name, None); | ||||
| 
 | ||||
|       match get_field_type(field) { | ||||
|         Some(FieldType::FieldTypeString) => Some(quote! { | ||||
| @ -1077,13 +1073,9 @@ pub fn parse( | ||||
|           } | ||||
|         } | ||||
|         Some(FieldType::FieldTypeStruct { struct_name }) => { | ||||
|           let struct_ident = Ident::new( | ||||
|             &format!( | ||||
|               "__Visitor_{}_{}", | ||||
|               label_name, | ||||
|               struct_name.into_token_stream() | ||||
|             ), | ||||
|             Span::call_site(), | ||||
|           let struct_ident = build_visitor_ident( | ||||
|             &label_name, | ||||
|             Some(&struct_name.into_token_stream().to_string()), | ||||
|           ); | ||||
| 
 | ||||
|           Some(quote! { | ||||
| @ -1307,12 +1299,12 @@ fn build_call_visitor( | ||||
| 
 | ||||
|   // let label = &field.ident;
 | ||||
|   let value_label = get_value_label(label); | ||||
|   let label_name = if let Some(ref value) = field_attrs.rename { | ||||
|     Ident::new(&value.to_string(), Span::call_site()).to_string() | ||||
|   } else { | ||||
|     label.clone().unwrap().to_string() | ||||
|   }; | ||||
|   let visitor_label = Ident::new(&format!("__Visitor{}", label_name), Span::call_site()); | ||||
|   let label_name = field_attrs | ||||
|     .rename | ||||
|     .clone() | ||||
|     .unwrap_or_else(|| label.as_ref().unwrap().to_string()); | ||||
| 
 | ||||
|   let visitor_label = build_visitor_ident(&label_name, None); | ||||
| 
 | ||||
|   let namespaces_matches: TokenStream = namespaces | ||||
|     .iter() | ||||
| @ -1410,3 +1402,14 @@ fn get_value_label(ident: &Option<syn::Ident>) -> Option<syn::Ident> { | ||||
|     None => None, | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| fn build_visitor_ident(label: &str, struct_id: Option<&str>) -> Ident { | ||||
|   Ident::new( | ||||
|     &format!( | ||||
|       "__Visitor_{}_{}", | ||||
|       label.replace(".", "_"), | ||||
|       struct_id.unwrap_or("") | ||||
|     ), | ||||
|     Span::call_site(), | ||||
|   ) | ||||
| } | ||||
|  | ||||
| @ -24,16 +24,9 @@ pub fn serialize( | ||||
|         return None; | ||||
|       } | ||||
| 
 | ||||
|       let renamed_label = match field_attrs.rename { | ||||
|         Some(value) => Ident::new(&value, Span::call_site()), | ||||
|         None => field.ident.clone().unwrap(), | ||||
|       }; | ||||
|       let label = &field.ident; | ||||
|       let label_name = if let Some(prefix) = field_attrs.prefix { | ||||
|         prefix + ":" + renamed_label.to_string().as_ref() | ||||
|       } else { | ||||
|         renamed_label.to_string() | ||||
|       }; | ||||
| 
 | ||||
|       let label_name = build_label_name(&field, &field_attrs); | ||||
| 
 | ||||
|       match get_field_type(field) { | ||||
|         Some(FieldType::FieldTypeString) | ||||
| @ -270,16 +263,7 @@ pub fn serialize( | ||||
|         )); | ||||
|       } | ||||
| 
 | ||||
|       let renamed_label = match field_attrs.rename { | ||||
|         Some(value) => Ident::new(&value, Span::call_site()), | ||||
|         None => field.ident.clone().unwrap(), | ||||
|       }; | ||||
| 
 | ||||
|       let label_name = if let Some(prefix) = field_attrs.prefix { | ||||
|         format!("{}:{}", prefix, renamed_label) | ||||
|       } else { | ||||
|         renamed_label.to_string() | ||||
|       }; | ||||
|       let label_name = build_label_name(&field, &field_attrs); | ||||
| 
 | ||||
|       match get_field_type(field) { | ||||
|         Some(FieldType::FieldTypeString) | ||||
| @ -473,3 +457,17 @@ 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 + ":"), | ||||
|     field_attrs | ||||
|       .rename | ||||
|       .clone() | ||||
|       .unwrap_or_else(|| field.ident.as_ref().unwrap().to_string()) | ||||
|   ) | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user