xavier-derive 0.1.7

Derive module of Xavier. Xavier is a lightweight and versatile XML parsing library designed to streamline the process of handling XML data with ease and efficiency.
Documentation
use syn::{LitStr, Type};
use proc_macro2::{ Ident, TokenStream };
use quote::{ quote, ToTokens };
use crate::common::meta::MetaInfo;
use crate::common::naming::names::XmlNames;
use crate::serialize::parser::extension::XmlExtension;
use crate::serialize::parser::types::is_outer_option;

pub struct XmlElementAttr {
    pub field: Ident,
    pub name: LitStr,
    pub ty: Type
}

impl ToTokens for XmlElementAttr {
    fn to_tokens(&self, tokens: &mut TokenStream) {
        let field = &self.field;
        let name = &self.name;
        let attr_tokens = if is_outer_option(&self.ty) {
            quote! {
                if self.#field.is_none() {
                    "".to_string()
                } else {
                    format!(" {}=\"{}\"", #name, xavier::serialize::encode::escape_xml(&self.#field.to_xml(None, false)))
                }
            }
        } else {
            quote! {
                format!(" {}=\"{}\"", #name, xavier::serialize::encode::escape_xml(&self.#field.to_xml(None, false)))
            }
        };
        tokens.extend(attr_tokens);
    }
}

impl XmlElementAttr {
    pub fn parse(field: Ident, ty: Type, obj_meta: Option<&MetaInfo>, meta: Option<&MetaInfo>, _: XmlExtension) -> Option<XmlElementAttr> {
        meta.and_then(|meta| {
            if meta.contains("attribute") {
                let name = XmlNames::attribute(&field, obj_meta, &meta);
                Some(XmlElementAttr { field, name, ty })
            } else {
                None
            }
        })
    }
}