1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
use quote::quote_spanned;
use syn::{parse_macro_input, Error, Lit};
/// Converts a `&str` literal to `&[char]`.
///
/// ```rust
/// use utf32_lit::utf32;
/// let s = utf32!("æbc");
/// assert_eq!(s, &['æ', 'b', 'c']);
/// ```
#[proc_macro]
pub fn utf32(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
match parse_macro_input!(input as Lit) {
Lit::Str(s) => {
let string = s.value();
let chars = string.chars();
quote_spanned!(s.span()=> &[#(#chars),*])
}
other => {
let message = "expected string literal";
Error::new_spanned(other, message).to_compile_error()
}
}
.into()
}