Merge pull request #29 from DmitrySamoylov/fix-name-issue

Allow struct fields be named as 'name' (issue #21)
This commit is contained in:
Marc-Antoine ARNAUD 2019-12-10 10:04:25 +01:00 committed by GitHub
commit 90f19a3a5e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 55 additions and 8 deletions

View File

@ -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"),
}
);
}

View File

@ -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);
}

View File

@ -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,
}
}