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\" />";
|
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);
|
||||||
|
}
|
||||||
|
|||||||
@ -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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user