typekin 0.6.0

new-type pattern with concept of Friends borrowed from c++, no-std and fully const
Documentation
use crate::flag::cfg::BitflagCfg;
use crate::flag::maker::Maker;
use crate::runner;
use crate::runner::MkErr;
use quote::quote;
use syn::Fields;
use syn::spanned::Spanned;

pub(crate) fn bitflag(
    attr: proc_macro::TokenStream,
    item: proc_macro::TokenStream,
) -> proc_macro::TokenStream {
    let cfg = Box::new(syn::parse_macro_input!(attr as BitflagCfg));
    let item = syn::parse_macro_input!(item as syn::ItemEnum);

    return runner::ekran_catching(move || {
        let repr = runner::find_repr_n(&item.attrs, item.span())?;
        let ty = item.ident.clone();
        let items = item.variants.iter().map(|it| it.ident.clone()).collect();

        if let Some(bad) = item
            .variants
            .iter()
            .find(|it| !matches!(it.fields, Fields::Unit))
        {
            return bad.fail("only unit variants are supported");
        }

        let stream = Maker::new(ty, repr, cfg, items).ekran()?;
        return Ok(quote! { #item #stream });
    });
}