Merge pull request #111 from ephraimkunz/text-attribute-optional-strings

Allow adding the 'text' attribute to Option<String>
This commit is contained in:
Marc-Antoine ARNAUD 2021-05-30 19:26:15 +02:00 committed by GitHub
commit de47220412
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 63 additions and 8 deletions

View File

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

View File

@ -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 {

View File

@ -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)]

View File

@ -303,7 +303,13 @@ pub fn parse(
match field.get_type() { match field.get_type() {
Field::FieldString => set_text(&quote! { text_content.to_owned() }), Field::FieldString => set_text(&quote! { text_content.to_owned() }),
Field::FieldStruct { .. } | Field::FieldOption { .. } | Field::FieldVec { .. } => None, Field::FieldOption { data_type } => match *data_type {
Field::FieldString => set_text(
&quote! { 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(&quote! { #type_token::from_str(text_content).unwrap() }) set_text(&quote! { #type_token::from_str(text_content).unwrap() })

View File

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

View File

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