pkenum_core 0.2.0

Core logic for pkenum.
Documentation
use crate::tokens::EnumToken;
use proc_macro_error::abort;
use proc_macro2::TokenStream;
use syn::{ Item, ItemEnum };
use quote::quote;

/// Returns the AST of an enum if the passed TokenStream consists of one.
pub fn parse(tokens: TokenStream) -> ItemEnum {
    match syn::parse2::<Item>(tokens) {
        Ok(Item::Enum(item)) => item,
        Ok(item) => abort!(item, "item is not an enum"; help = "pkenum_macro::Display can only be used on enums"),
        Err(_) => unreachable!(),
    }
}

/// Maps an enum's AST to an EnumToken.
pub fn analyze(item: ItemEnum) -> EnumToken {
    EnumToken::new(
        item.ident,
        item.variants
            .into_iter()
            .map(|variant| variant.ident)
            .collect())
}

/// Generates a Display and EnumStr implementation for the enum referenced in EnumToken.
pub fn codegen(token: EnumToken) -> TokenStream {
    let name = token.name;
    let variants = token.variants;

    quote! {
        impl #name {
            fn to_static_str(&self) -> &str {
                match self {
                    #(#name::#variants => stringify!(#variants),)*
                }
            }
        }

        impl std::fmt::Display for #name {
            fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
                write!(f, "{}", self.to_static_str())
            }
        }
    }.into()
}