Merge pull request #111 from ephraimkunz/text-attribute-optional-strings
Allow adding the 'text' attribute to Option<String>
This commit is contained in:
commit
de47220412
@ -440,6 +440,26 @@ fn de_text_content_with_attributes() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn de_text_attribute_on_optional_string() {
|
||||||
|
#[derive(YaDeserialize, PartialEq, Debug)]
|
||||||
|
#[yaserde(rename = "base")]
|
||||||
|
pub struct XmlStruct {
|
||||||
|
#[yaserde(text)]
|
||||||
|
text: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
let model = XmlStruct {
|
||||||
|
text: Some("Testing text".to_string()),
|
||||||
|
};
|
||||||
|
let content = r#"<base>Testing text</base>"#;
|
||||||
|
convert_and_validate!(content, XmlStruct, model);
|
||||||
|
|
||||||
|
let model = XmlStruct { text: None };
|
||||||
|
let content = r#"<base></base>"#;
|
||||||
|
convert_and_validate!(content, XmlStruct, model);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn de_enum() {
|
fn de_enum() {
|
||||||
init();
|
init();
|
||||||
|
|||||||
@ -54,7 +54,7 @@ fn basic_flatten() {
|
|||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
DateKind::Working
|
DateKind::Working
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
let model = DateTime {
|
let model = DateTime {
|
||||||
date: Date {
|
date: Date {
|
||||||
|
|||||||
@ -324,6 +324,28 @@ fn ser_text_content_with_attributes() {
|
|||||||
serialize_and_validate!(model, content);
|
serialize_and_validate!(model, content);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn ser_text_attribute_on_optional_string() {
|
||||||
|
#[derive(YaSerialize, PartialEq, Debug)]
|
||||||
|
#[yaserde(rename = "base")]
|
||||||
|
pub struct XmlStruct {
|
||||||
|
#[yaserde(text)]
|
||||||
|
text: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
let model = XmlStruct {
|
||||||
|
text: Some("Testing text".to_string()),
|
||||||
|
};
|
||||||
|
|
||||||
|
let content = r#"<base>Testing text</base>"#;
|
||||||
|
serialize_and_validate!(model, content);
|
||||||
|
|
||||||
|
let model = XmlStruct { text: None };
|
||||||
|
|
||||||
|
let content = r#"<base></base>"#;
|
||||||
|
serialize_and_validate!(model, content);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn ser_keyword() {
|
fn ser_keyword() {
|
||||||
#[derive(YaSerialize, PartialEq, Debug)]
|
#[derive(YaSerialize, PartialEq, Debug)]
|
||||||
|
|||||||
@ -303,7 +303,13 @@ pub fn parse(
|
|||||||
|
|
||||||
match field.get_type() {
|
match field.get_type() {
|
||||||
Field::FieldString => set_text("e! { text_content.to_owned() }),
|
Field::FieldString => set_text("e! { text_content.to_owned() }),
|
||||||
Field::FieldStruct { .. } | Field::FieldOption { .. } | Field::FieldVec { .. } => None,
|
Field::FieldOption { data_type } => match *data_type {
|
||||||
|
Field::FieldString => set_text(
|
||||||
|
"e! { if text_content.is_empty() { None } else { Some(text_content.to_owned()) }},
|
||||||
|
),
|
||||||
|
_ => None,
|
||||||
|
},
|
||||||
|
Field::FieldStruct { .. } | Field::FieldVec { .. } => None,
|
||||||
simple_type => {
|
simple_type => {
|
||||||
let type_token: TokenStream = simple_type.into();
|
let type_token: TokenStream = simple_type.into();
|
||||||
set_text("e! { #type_token::from_str(text_content).unwrap() })
|
set_text("e! { #type_token::from_str(text_content).unwrap() })
|
||||||
|
|||||||
@ -14,7 +14,7 @@ pub fn derive_deserialize(input: TokenStream) -> TokenStream {
|
|||||||
let ast = syn::parse(input).unwrap();
|
let ast = syn::parse(input).unwrap();
|
||||||
match de::expand_derive_deserialize(&ast) {
|
match de::expand_derive_deserialize(&ast) {
|
||||||
Ok(expanded) => expanded.into(),
|
Ok(expanded) => expanded.into(),
|
||||||
Err(msg) => panic!(msg),
|
Err(msg) => panic!("{}", msg),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -23,6 +23,6 @@ pub fn derive_serialize(input: TokenStream) -> TokenStream {
|
|||||||
let ast = syn::parse(input).unwrap();
|
let ast = syn::parse(input).unwrap();
|
||||||
match ser::expand_derive_serialize(&ast) {
|
match ser::expand_derive_serialize(&ast) {
|
||||||
Ok(expanded) => expanded.into(),
|
Ok(expanded) => expanded.into(),
|
||||||
Err(msg) => panic!(msg),
|
Err(msg) => panic!("{}", msg),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -145,10 +145,17 @@ pub fn serialize(
|
|||||||
.map(|field| {
|
.map(|field| {
|
||||||
let label = field.label();
|
let label = field.label();
|
||||||
if field.is_text_content() {
|
if field.is_text_content() {
|
||||||
return Some(quote!(
|
return match field.get_type() {
|
||||||
let data_event = ::xml::writer::XmlEvent::characters(&self.#label);
|
Field::FieldOption { .. } => Some(quote!(
|
||||||
writer.write(data_event).map_err(|e| e.to_string())?;
|
let s = self.#label.as_deref().unwrap_or_default();
|
||||||
));
|
let data_event = ::xml::writer::XmlEvent::characters(s);
|
||||||
|
writer.write(data_event).map_err(|e| e.to_string())?;
|
||||||
|
)),
|
||||||
|
_ => Some(quote!(
|
||||||
|
let data_event = ::xml::writer::XmlEvent::characters(&self.#label);
|
||||||
|
writer.write(data_event).map_err(|e| e.to_string())?;
|
||||||
|
)),
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
let label_name = field.renamed_label(root_attributes);
|
let label_name = field.renamed_label(root_attributes);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user