hmmmm_derive 0.1.0

Derive macros for the hmmmm crate.
Documentation
use proc_macro2::TokenStream;
use quote::quote;
use syn::{DeriveInput};

use crate::helpers::{
  base_enum_implementation, copy_clone_implementation, enum_variants_to_match_arms,
  get_enum_variants, check_u8,
};

pub(crate) fn derive_state_inner(ast: &DeriveInput) -> syn::Result<TokenStream> {
  let name = &ast.ident;
  let gen = &ast.generics;
  let (impl_generics, ty_generics, where_clause) = gen.split_for_impl();

  check_u8(ast)?;

  let variants = get_enum_variants(ast)?;
  let n = variants.len();
  let arms = enum_variants_to_match_arms(name, variants);

  let base_implementation = base_enum_implementation(n, &arms);
  let copy_clone = copy_clone_implementation(name, gen);

  Ok(quote! {
    impl #impl_generics hmmmm::prelude::State for #name #ty_generics #where_clause {
      #base_implementation
    }

    #copy_clone
  })
}