1use proc_macro::{TokenStream, TokenTree};
2
3#[proc_macro_derive(ToBox)]
4pub fn derive_as_box(tokens: TokenStream) -> TokenStream {
5 let mut target_name = None;
6 let mut token_iter = tokens.into_iter();
7
8 while let Some(token) = token_iter.next() {
9 if let TokenTree::Ident(ident) = token {
10 let ident_str = ident.to_string();
11 if ident_str == "struct" || ident_str == "enum" {
12 target_name = token_iter.next().map(|token| token.to_string());
13
14 break;
15 }
16 }
17 }
18
19 if let Some(name) = target_name {
20 format!("impl ToBox for {} {{}}", name).parse().unwrap()
21 } else {
22 panic!("Must be derived on enum or struct")
23 }
24}