enum-bitset-derive 0.2.1

Proc macros for the enum-bitset macro
Documentation
use proc_macro2::{Span, TokenStream as TokenStream2};
use quote::quote;
use syn::LitStr;

use crate::derive::config::EnumBitsetConfig;

impl EnumBitsetConfig {
    pub fn derive_core_traits(&self) -> TokenStream2 {
        let name = &self.set_type;
        let base_ty = &self.base_type;

        let to_value_branches = self.base_to_value_branches();

        quote! {
            impl Default for #name {
                #[inline(always)]
                fn default() -> Self {
                    Self { items: 0 }
                }
            }

            impl From<#base_ty> for #name {
                #[inline(always)]
                fn from(item: #base_ty) -> Self {
                    (&item).into()
                }
            }

            impl From<&#base_ty> for #name {
                #[inline(always)]
                fn from(item: &#base_ty) -> Self {
                    let items = match item {
                        #(#to_value_branches),*
                    };

                    Self { items }
                }
            }
        }
    }

    pub fn derive_debug(&self) -> TokenStream2 {
        if !self.debug {
            return TokenStream2::new();
        }

        let name = &self.set_type;
        let base_ty = &self.base_type;
        let my_crate = &self.my_crate;

        let name_lit = LitStr::new(&name.to_string(), Span::call_site());

        quote! {
            use #my_crate::debug_impl::{NoDebug, DebugWrapper};

            impl Debug for #name {
                fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
                    f.write_str(#name_lit)?;

                    if f.alternate() {
                        write!(f, " ({}) ", self.len())?;
                    }
                    else {
                        write!(f, "({})", self.len())?;
                    }

                    DebugWrapper::<#base_ty>(PhantomData).debug_entries(f, self.len(), self.iter())
                }
            }
        }
    }
}