thisslime-derive 0.5.1

Derive macros for thisslime.
Documentation
use crate::tracing_error::derive;
use attribute_derive::FromAttr;
use derive::{attrs, model};

pub fn quote(input: &syn::DeriveInput) -> syn::Result<syn::ImplItemFn> {
    match input.data {
        syn::Data::Struct(ref data) => {
            let attr = attrs::Event::from_attributes(&input.attrs)?;

            let tracing_fields = data
                .fields
                .iter()
                .map(model::Field::try_from)
                .collect::<Result<_, syn::Error>>();

            if let Ok(tracing_fields) = tracing_fields {
                let event = model::Event::new(attr.level, tracing_fields, true);
                let tracing_event = event.into_macro_call();

                Ok(syn::parse_quote!(
                    fn construct(&self) {
                        #tracing_event;
                    }
                ))
            } else {
                Ok(syn::parse_quote!(
                    fn construct(&self) {
                        self.default_event();
                    }
                ))
            }
        }
        syn::Data::Enum(_) => {
            let attr = attrs::Event::from_attributes(&input.attrs)?;
            let event = model::Event::new(attr.level, Vec::new(), true);
            let tracing_event = event.into_macro_call();

            Ok(syn::parse_quote!(
                fn construct(&self) {
                    #tracing_event;
                }
            ))
        }
        syn::Data::Union(..) => unimplemented!(),
    }
}