lure_macros/
lib.rs

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(); // Convert error message to string
14
15    let tokens = vec![
16        // "::"
17        TokenTree::Punct(Punct::new(':', Spacing::Joint)),
18        TokenTree::Punct(Punct::new(':', Spacing::Alone)),
19        // "std"
20        TokenTree::Ident(Ident::new("std", proc_macro::Span::call_site())),
21        // "::"
22        TokenTree::Punct(Punct::new(':', Spacing::Joint)),
23        TokenTree::Punct(Punct::new(':', Spacing::Alone)),
24        // "compile_error"
25        TokenTree::Ident(Ident::new("compile_error", proc_macro::Span::call_site())),
26        // "!"
27        TokenTree::Punct(Punct::new('!', Spacing::Alone)),
28        // "()" with a string literal inside
29        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}