use proc_macro2::{Ident, Span, TokenStream}; pub fn enclose_formatted_characters(label: &Ident, label_name: String) -> TokenStream { quote! { let start_event = XmlEvent::start_element(#label_name); let _ret = writer.write(start_event); let yas_value = format!("{}", &self.#label); let data_event = XmlEvent::characters(&yas_value); let _ret = writer.write(data_event); let end_event = XmlEvent::end_element(); let _ret = writer.write(end_event); } } pub fn enclose_formatted_characters_for_value(label: &Ident, label_name: String) -> TokenStream { quote! { let start_event = XmlEvent::start_element(#label_name); let _ret = writer.write(start_event); let value = format!("{}", #label); let data_event = XmlEvent::characters(&value); let _ret = writer.write(data_event); let end_event = XmlEvent::end_element(); let _ret = writer.write(end_event); } } pub fn enclose_characters(label: &Option, label_name: String) -> TokenStream { quote! { let start_event = XmlEvent::start_element(#label_name); let _ret = writer.write(start_event); let value = format!("{}", self.#label); let data_event = XmlEvent::characters(&value); let _ret = writer.write(data_event); let end_event = XmlEvent::end_element(); let _ret = writer.write(end_event); } } pub fn serialize_element( label: &Option, label_name: String, default: &Option, ) -> Option { let inner = enclose_characters(label, label_name); if let Some(ref d) = default { let default_function = Ident::new( &d, label .as_ref() .map_or(Span::call_site(), |ident| ident.span()), ); Some(quote! { if self.#label != #default_function() { #inner } }) } else { Some(quote! { #inner }) } }