1use proc_macro::{Delimiter, Group, Ident, Literal, Punct, Spacing, TokenStream, TokenTree};
2
3#[proc_macro]
4pub fn expand_regex(input: TokenStream) -> TokenStream {
5 let re = input.to_string();
6 match regex::Regex::new(&re) {
7 Ok(_) => input,
8 Err(e) => generate_compile_error(format!("Invalid regex: {}", e)),
9 }
10}
11
12fn generate_compile_error(e: impl ToString) -> TokenStream {
13 let msg = e.to_string(); let tokens = vec![
16 TokenTree::Punct(Punct::new(':', Spacing::Joint)),
18 TokenTree::Punct(Punct::new(':', Spacing::Alone)),
19 TokenTree::Ident(Ident::new("std", proc_macro::Span::call_site())),
21 TokenTree::Punct(Punct::new(':', Spacing::Joint)),
23 TokenTree::Punct(Punct::new(':', Spacing::Alone)),
24 TokenTree::Ident(Ident::new("compile_error", proc_macro::Span::call_site())),
26 TokenTree::Punct(Punct::new('!', Spacing::Alone)),
28 TokenTree::Group(Group::new(
30 Delimiter::Parenthesis,
31 vec![TokenTree::Literal(Literal::string(&msg))]
32 .into_iter()
33 .collect(),
34 )),
35 ];
36
37 tokens.into_iter().collect()
38}