1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{
4 parse_macro_input, parse_quote_spanned,
5 visit_mut::{self, VisitMut},
6 Expr, Lit,
7};
8
9#[proc_macro]
21pub fn utf32(input: TokenStream) -> TokenStream {
22 let mut expr = parse_macro_input!(input as Expr);
23 Utf32Replace.visit_expr_mut(&mut expr);
24 quote!(#expr).into()
25}
26
27struct Utf32Replace;
28
29impl VisitMut for Utf32Replace {
30 fn visit_expr_mut(&mut self, node: &mut Expr) {
31 if let Expr::Lit(expr) = &node {
32 if let Lit::Str(s) = &expr.lit {
33 let string = s.value();
34 let chars = string.chars();
35 *node = parse_quote_spanned!(s.span()=> &[#(#chars),*] as &[char]);
36 }
37 }
38 visit_mut::visit_expr_mut(self, node);
39 }
40}
41
42#[proc_macro_attribute]
54pub fn utf32_all_strings(_attr: TokenStream, input: TokenStream) -> TokenStream {
55 let mut item = parse_macro_input!(input);
56 Utf32Replace.visit_item_mut(&mut item);
57 quote!(#item).into()
58}