diff --git a/yaserde/tests/deserializer.rs b/yaserde/tests/deserializer.rs index a30607e..d3f4636 100644 --- a/yaserde/tests/deserializer.rs +++ b/yaserde/tests/deserializer.rs @@ -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 = "Little prince"; + convert_and_validate!( + content, + Book, + Book { + name: String::from("Little prince"), + } + ); +} diff --git a/yaserde/tests/serializer.rs b/yaserde/tests/serializer.rs index e4ee903..1290131 100644 --- a/yaserde/tests/serializer.rs +++ b/yaserde/tests/serializer.rs @@ -298,3 +298,19 @@ fn ser_attribute_enum() { let 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 = "something"; + convert_and_validate!(model, content); +} diff --git a/yaserde_derive/src/de/expand_struct.rs b/yaserde_derive/src/de/expand_struct.rs index 0864af9..f3a61ab 100644 --- a/yaserde_derive/src/de/expand_struct.rs +++ b/yaserde_derive/src/de/expand_struct.rs @@ -35,7 +35,7 @@ pub fn parse( .fields .iter() .map(|field| { - let label = &field.ident; + let label = &get_value_label(&field.ident); let field_attrs = YaSerdeAttribute::parse(&field.attrs); match get_field_type(field) { @@ -401,6 +401,7 @@ pub fn parse( .map(|field| { let field_attrs = YaSerdeAttribute::parse(&field.attrs); let label = &field.ident; + let value_label = &get_value_label(&field.ident); if field_attrs.attribute { return None; @@ -550,7 +551,7 @@ pub fn parse( reader.set_map_value(); match #struct_name::deserialize(reader) { Ok(parsed_item) => { - #label = parsed_item; + #value_label = parsed_item; let _root = reader.next_event(); }, Err(msg) => { @@ -704,7 +705,7 @@ pub fn parse( reader.set_map_value(); match #struct_ident::deserialize(reader) { Ok(parsed_item) => { - #label = Some(parsed_item); + #value_label = Some(parsed_item); let _root = reader.next_event(); }, Err(msg) => { @@ -862,7 +863,7 @@ pub fn parse( reader.set_map_value(); match #struct_ident::deserialize(reader) { Ok(parsed_item) => { - #label.push(parsed_item); + #value_label.push(parsed_item); let _root = reader.next_event(); }, Err(msg) => { @@ -894,7 +895,7 @@ pub fn parse( return None; } - let label = &field.ident; + let label = &get_value_label(&field.ident); let label_name = if let Some(value) = field_attrs.rename { Ident::new(&value.to_string(), Span::call_site()).to_string() } else { @@ -1114,7 +1115,7 @@ pub fn parse( .fields .iter() .map(|field| { - let label = &field.ident; + let label = &get_value_label(&field.ident); let field_attrs = YaSerdeAttribute::parse(&field.attrs); match get_field_type(field) { @@ -1195,10 +1196,11 @@ pub fn parse( .iter() .map(|field| { let label = &field.ident; + let value_label = &get_value_label(&field.ident); if get_field_type(field).is_some() { Some(quote! { - #label: #label, + #label: #value_label, }) } else { None @@ -1307,6 +1309,7 @@ fn build_call_visitor( let prefix = field_attrs.prefix.clone(); // 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 { @@ -1361,7 +1364,7 @@ fn build_call_visitor( }); if let Ok(value) = result { - #label#action + #value_label#action } } }) @@ -1400,3 +1403,13 @@ fn build_set_text_to_value( None } } + +fn get_value_label(ident: &Option) -> Option { + match &ident { + Some(ident) => Some(syn::Ident::new( + &format!("__{}_value", ident.to_string()), + ident.span(), + )), + None => None, + } +}