use proc_macro2::Literal;
use quote::quote;
use syn::Data;
pub fn derive(input: syn::DeriveInput) -> proc_macro2::TokenStream {
let enum_name = &input.ident;
let data = match &input.data {
Data::Enum(e) => e,
_ => panic!("Cannot derive for non-enum type"),
};
let cases = data.variants.iter()
.map(|variant| {
let ident = &variant.ident;
let variant_str = Literal::string(&ident.to_string());
quote! { #enum_name::#ident => #variant_str }
});
quote! {
impl ::derive_enum::Name for #enum_name {
fn name(&self) -> &'static str {
match self {
#(#cases),*
}
}
}
}
}