use crate::tokens::EnumToken;
use proc_macro_error::abort;
use proc_macro2::TokenStream;
use syn::{ Item, ItemEnum };
use quote::quote;
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!(),
}
}
pub fn analyze(item: ItemEnum) -> EnumToken {
EnumToken::new(
item.ident,
item.variants
.into_iter()
.map(|variant| variant.ident)
.collect())
}
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()
}