Some macros change their environment variables. For example, sqlx
loads all variables from .env
file. These envs can affect the expansion of other macros. For example, an sqlx
macro from crate A
can affect sqlx
macros from crate B
.
Demo:
#[proc_macro]
pub fn set_var(_: TokenStream) -> TokenStream {
std::env::set_var("FOO", "bad");
TokenStream::new()
}
#[proc_macro]
pub fn read_var(_: TokenStream) -> TokenStream {
let var = std::env::var("FOO").unwrap_or_else(|_| "good".to_string());
format!("\"{}\"", var).parse().unwrap()
}
then use them like this:
fn main() {
my_proc_macro::set_var!();
let b = my_proc_macro::read_var!();
}
read_var!()
should be expanded to "good", but it will likely be expanded to "bad".