Skip to content

Commit

Permalink
Merge 85f4615 into 2a3716c
Browse files Browse the repository at this point in the history
  • Loading branch information
DmitrySamoylov committed Dec 10, 2019
2 parents 2a3716c + 85f4615 commit c4046b1
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 8 deletions.
18 changes: 18 additions & 0 deletions yaserde/tests/deserializer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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"),
}
);
}
16 changes: 16 additions & 0 deletions yaserde/tests/serializer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
29 changes: 21 additions & 8 deletions yaserde_derive/src/de/expand_struct.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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) => {
Expand Down Expand Up @@ -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) => {
Expand Down Expand Up @@ -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) => {
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -1361,7 +1364,7 @@ fn build_call_visitor(
});

if let Ok(value) = result {
#label#action
#value_label#action
}
}
})
Expand Down Expand Up @@ -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,
}
}

0 comments on commit c4046b1

Please sign in to comment.