Documentation
use proc_macro::{TokenStream, TokenTree};

#[proc_macro_derive(ToBox)]
pub fn derive_as_box(tokens: TokenStream) -> TokenStream {
  let mut target_name = None;
  let mut token_iter = tokens.into_iter();

  while let Some(token) = token_iter.next() {
    if let TokenTree::Ident(ident) = token {
      let ident_str = ident.to_string();
      if ident_str == "struct" || ident_str == "enum" {
        target_name = token_iter.next().map(|token| token.to_string());

        break;
      }
    }
  }

  if let Some(name) = target_name {
    format!("impl ToBox for {} {{}}", name).parse().unwrap()
  } else {
    panic!("Must be derived on enum or struct")
  }
}