use proc_macro::Literal;
use proc_macro::TokenStream;
use proc_macro::TokenTree;
#[proc_macro]
pub fn charize(input: TokenStream) -> TokenStream {
let mut ch = None;
let mut iter = input.into_iter();
while ch.is_none() {
if let Some(token) = iter.next() {
debug_assert!(
iter.next().is_none(),
"Charize not support multiple characters"
);
match &token {
TokenTree::Ident(ident) => {
let ident = ident.to_string();
let mut chars = ident.chars();
ch = chars.next();
debug_assert_eq!(chars.count(), 0, "Charize only support one character");
}
TokenTree::Punct(punct) => {
ch = Some(punct.as_char());
}
TokenTree::Literal(lit) => {
let lit = lit.to_string();
let mut chars = lit.chars();
ch = chars.next();
debug_assert_eq!(chars.count(), 0, "Charize only support one character");
}
TokenTree::Group(group) => {
iter = group.stream().into_iter();
}
}
}
}
let mut token = TokenStream::new();
let value = ch.expect("Charize expect token to charize!");
let tree = TokenTree::Literal(Literal::character(value));
token.extend([tree]);
token
}