Merge pull request #34 from DmitrySamoylov/fix-dots-in-names
Fix compilation errors when element name contains dots
This commit is contained in:
		
						commit
						d68a924bdb
					
				| @ -181,6 +181,8 @@ fn de_rename() { | |||||||
|     item: String, |     item: String, | ||||||
|     #[yaserde(rename = "sub")] |     #[yaserde(rename = "sub")] | ||||||
|     sub_struct: SubStruct, |     sub_struct: SubStruct, | ||||||
|  |     #[yaserde(rename = "maj.min.bug")] | ||||||
|  |     with_dots: String, | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   #[derive(YaDeserialize, PartialEq, Debug)] |   #[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!( |   convert_and_validate!( | ||||||
|     content, |     content, | ||||||
|     XmlStruct, |     XmlStruct, | ||||||
| @ -207,6 +209,7 @@ fn de_rename() { | |||||||
|       sub_struct: SubStruct { |       sub_struct: SubStruct { | ||||||
|         subitem: "sub_something".to_string(), |         subitem: "sub_something".to_string(), | ||||||
|       }, |       }, | ||||||
|  |       with_dots: "2.0.1".into() | ||||||
|     } |     } | ||||||
|   ); |   ); | ||||||
| } | } | ||||||
| @ -378,6 +381,8 @@ fn de_complex_enum() { | |||||||
|     Magenta(Vec<OtherStruct>), |     Magenta(Vec<OtherStruct>), | ||||||
|     #[yaserde(rename = "NotSoCyan")] |     #[yaserde(rename = "NotSoCyan")] | ||||||
|     Cyan(Vec<OtherStruct>), |     Cyan(Vec<OtherStruct>), | ||||||
|  |     #[yaserde(rename = "renamed.with.dots")] | ||||||
|  |     Dotted(u32), | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   impl Default for Color { |   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] | #[test] | ||||||
|  | |||||||
| @ -125,6 +125,8 @@ fn ser_rename() { | |||||||
|     item: String, |     item: String, | ||||||
|     #[yaserde(rename = "sub")] |     #[yaserde(rename = "sub")] | ||||||
|     sub_struct: SubStruct, |     sub_struct: SubStruct, | ||||||
|  |     #[yaserde(rename = "maj.min.bug")] | ||||||
|  |     version: String, | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   #[derive(YaSerialize, PartialEq, Debug)] |   #[derive(YaSerialize, PartialEq, Debug)] | ||||||
| @ -154,9 +156,10 @@ fn ser_rename() { | |||||||
|     sub_struct: SubStruct { |     sub_struct: SubStruct { | ||||||
|       subitem: "sub_something".to_string(), |       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); |   convert_and_validate!(model, content); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -326,6 +329,8 @@ fn ser_unnamed_enum() { | |||||||
|     Structs(Vec<OtherStruct>), |     Structs(Vec<OtherStruct>), | ||||||
|     #[yaserde(rename = "renamed")] |     #[yaserde(rename = "renamed")] | ||||||
|     ToRename(u32), |     ToRename(u32), | ||||||
|  |     #[yaserde(rename = "renamed.with.dots")] | ||||||
|  |     ToRenameDots(u32), | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   impl Default for Enum { |   impl Default for Enum { | ||||||
| @ -422,6 +427,14 @@ fn ser_unnamed_enum() { | |||||||
|   let content = |   let content = | ||||||
|     "<?xml version=\"1.0\" encoding=\"utf-8\"?><base><color><renamed>87</renamed></color></base>"; |     "<?xml version=\"1.0\" encoding=\"utf-8\"?><base><color><renamed>87</renamed></color></base>"; | ||||||
|   convert_and_validate!(model, content); |   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] | #[test] | ||||||
|  | |||||||
| @ -207,7 +207,7 @@ pub fn parse( | |||||||
|         .rename |         .rename | ||||||
|         .unwrap_or_else(|| field.ident.as_ref().unwrap().to_string()); |         .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) { |       match get_field_type(field) { | ||||||
|         Some(FieldType::FieldTypeString) => { |         Some(FieldType::FieldTypeString) => { | ||||||
| @ -252,10 +252,7 @@ pub fn parse( | |||||||
|             .iter() |             .iter() | ||||||
|             .map(|s| s.ident.to_string()) |             .map(|s| s.ident.to_string()) | ||||||
|             .collect(); |             .collect(); | ||||||
|           let struct_ident = Ident::new( |           let struct_ident = build_visitor_ident(&label_name, Some(&struct_id)); | ||||||
|             &format!("__Visitor_{}_{}", label_name, struct_id), |  | ||||||
|             Span::call_site(), |  | ||||||
|           ); |  | ||||||
| 
 | 
 | ||||||
|           Some(quote! { |           Some(quote! { | ||||||
|             #[allow(non_snake_case, non_camel_case_types)] |             #[allow(non_snake_case, non_camel_case_types)] | ||||||
| @ -405,11 +402,10 @@ pub fn parse( | |||||||
|         return None; |         return None; | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       let label_name = if let Some(ref value) = field_attrs.rename { |       let label_name = field_attrs | ||||||
|         Ident::new(&value.to_string(), Span::call_site()).to_string() |         .rename | ||||||
|       } else { |         .clone() | ||||||
|         field.ident.clone().unwrap().to_string() |         .unwrap_or_else(|| label.as_ref().unwrap().to_string()); | ||||||
|       }; |  | ||||||
| 
 | 
 | ||||||
|       match get_field_type(field) { |       match get_field_type(field) { | ||||||
|         Some(FieldType::FieldTypeString) => { |         Some(FieldType::FieldTypeString) => { | ||||||
| @ -899,7 +895,7 @@ pub fn parse( | |||||||
|         .rename |         .rename | ||||||
|         .unwrap_or_else(|| field.ident.as_ref().unwrap().to_string()); |         .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) { |       match get_field_type(field) { | ||||||
|         Some(FieldType::FieldTypeString) => Some(quote! { |         Some(FieldType::FieldTypeString) => Some(quote! { | ||||||
| @ -1077,13 +1073,9 @@ pub fn parse( | |||||||
|           } |           } | ||||||
|         } |         } | ||||||
|         Some(FieldType::FieldTypeStruct { struct_name }) => { |         Some(FieldType::FieldTypeStruct { struct_name }) => { | ||||||
|           let struct_ident = Ident::new( |           let struct_ident = build_visitor_ident( | ||||||
|             &format!( |             &label_name, | ||||||
|               "__Visitor_{}_{}", |             Some(&struct_name.into_token_stream().to_string()), | ||||||
|               label_name, |  | ||||||
|               struct_name.into_token_stream() |  | ||||||
|             ), |  | ||||||
|             Span::call_site(), |  | ||||||
|           ); |           ); | ||||||
| 
 | 
 | ||||||
|           Some(quote! { |           Some(quote! { | ||||||
| @ -1307,12 +1299,12 @@ fn build_call_visitor( | |||||||
| 
 | 
 | ||||||
|   // let label = &field.ident;
 |   // let label = &field.ident;
 | ||||||
|   let value_label = get_value_label(label); |   let value_label = get_value_label(label); | ||||||
|   let label_name = if let Some(ref value) = field_attrs.rename { |   let label_name = field_attrs | ||||||
|     Ident::new(&value.to_string(), Span::call_site()).to_string() |     .rename | ||||||
|   } else { |     .clone() | ||||||
|     label.clone().unwrap().to_string() |     .unwrap_or_else(|| label.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); | ||||||
| 
 | 
 | ||||||
|   let namespaces_matches: TokenStream = namespaces |   let namespaces_matches: TokenStream = namespaces | ||||||
|     .iter() |     .iter() | ||||||
| @ -1410,3 +1402,14 @@ fn get_value_label(ident: &Option<syn::Ident>) -> Option<syn::Ident> { | |||||||
|     None => None, |     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; |         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 = &field.ident; | ||||||
|       let label_name = if let Some(prefix) = field_attrs.prefix { | 
 | ||||||
|         prefix + ":" + renamed_label.to_string().as_ref() |       let label_name = build_label_name(&field, &field_attrs); | ||||||
|       } else { |  | ||||||
|         renamed_label.to_string() |  | ||||||
|       }; |  | ||||||
| 
 | 
 | ||||||
|       match get_field_type(field) { |       match get_field_type(field) { | ||||||
|         Some(FieldType::FieldTypeString) |         Some(FieldType::FieldTypeString) | ||||||
| @ -270,16 +263,7 @@ pub fn serialize( | |||||||
|         )); |         )); | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       let renamed_label = match field_attrs.rename { |       let label_name = build_label_name(&field, &field_attrs); | ||||||
|         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() |  | ||||||
|       }; |  | ||||||
| 
 | 
 | ||||||
|       match get_field_type(field) { |       match get_field_type(field) { | ||||||
|         Some(FieldType::FieldTypeString) |         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