derive-enum-all-values 0.2.1

A procedural derive macro which exposes a method named `all_values` that returns all defined values as a compile-time static.
Documentation
extern crate proc_macro;
extern crate syn;
#[macro_use]
extern crate quote;

use proc_macro::TokenStream;

#[proc_macro_derive(AllValues)]
pub fn derive_all_variants(input: TokenStream) -> TokenStream {
    let syn_item: syn::DeriveInput = syn::parse(input).unwrap();
    let variants = match syn_item.data {
        syn::Data::Enum(enum_item) => enum_item.variants.into_iter().map(|v| v.ident),
        _ => panic!("AllValues only works on enums"),
    };

    let enum_name = syn_item.ident;
    let expanded = quote! {
        impl #enum_name {
            /// Returns a slice containing all variants (values) of the enum.
            /// Returned as a const, so can be used in compile time.
            pub const fn all_values() -> &'static[#enum_name] {
                &[ #(#enum_name::#variants),* ]
            }
        }
    };

    expanded.into()
}