use proc_macro2::TokenStream;
use quote::quote;
pub fn token_stream_and_error(s: TokenStream, e: syn::Error) -> TokenStream {
let error = e.to_compile_error();
quote! {
#s
#error
}
}
#[cfg(test)]
pub fn contains_compile_error(tokens: &TokenStream) -> bool {
tokens.to_string().contains(":: core :: compile_error ! {")
}
#[cfg(test)]
mod tests {
use super::*;
use proc_macro2::Span;
#[test]
fn token_stream_and_error_outputs_both() {
let canary = "hb46dmuio5ymoujartjhartyjh";
let s = quote! {
fn gxet54mnio5etgoj85rotgjm8otg5jm() {}
};
let e = syn::Error::new(Span::call_site(), canary);
let merged = token_stream_and_error(s, e);
let merged_str = merged.to_string();
assert!(merged_str.contains(canary));
assert!(merged_str.contains("gxet54mnio5etgoj85rotgjm8otg5jm"));
}
#[test]
fn contains_compile_error_yes_raw() {
let tokens = quote! {
let foo = "Some random stuff may also be here";
blah! { blah }
::core::compile_error! { "This is a test error message." };
let bar = "More random stuff here"
};
assert!(contains_compile_error(&tokens));
}
#[test]
fn contains_compile_error_yes_generated() {
let tokens = quote! {
let foo = "Some random stuff may also be here";
blah! { blah }
::core::compile_error!("This is a test error message.");
let bar = "More random stuff here"
};
let tokens = token_stream_and_error(tokens, syn::Error::new(Span::call_site(), "Testing"));
assert!(contains_compile_error(&tokens));
}
#[test]
fn contains_compile_error_no() {
let tokens = quote! {
let foo = "No compile error here!"
};
assert!(!contains_compile_error(&tokens));
}
}