1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use proc_macro::{self, TokenStream};

#[proc_macro_attribute]
pub fn compilation_guard(input: TokenStream, _: TokenStream) -> TokenStream {
    panic_logic(input);
    unreachable!()
}

fn panic_logic(input: TokenStream) {
    let mut iter = input.into_iter();
    match (iter.next(), iter.next()) {
        (Some(proc_macro::TokenTree::Literal(literal)), None) => {
            let s = literal.to_string();
            let s = format!("Compilation guard was triggered!\n{}", &s[1..s.len()-1]);
            panic!("{s}");
        }
        _ => panic!("This macro is expected to receive a `literal` as an argument.")
    }
}