Merge pull request #29 from DmitrySamoylov/fix-name-issue
Allow struct fields be named as 'name' (issue #21)
This commit is contained in:
commit
90f19a3a5e
@ -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\" />";
|
||||
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
|
||||
.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<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