use proc_macro::TokenStream;
use std::env;
use std::path::PathBuf;
#[proc_macro]
pub fn tests_bridge(input: TokenStream) -> TokenStream {
let crate_name = env::var("CARGO_CRATE_NAME").unwrap_or_default();
let package_name = env::var("CARGO_PKG_NAME")
.unwrap_or_default()
.replace('-', "_");
let bin_name = env::var("CARGO_BIN_NAME")
.unwrap_or_default()
.replace('-', "_");
if crate_name != package_name && crate_name != bin_name {
return TokenStream::new();
}
let lit = input.to_string().trim().to_string();
let mirror = lit.trim_matches('"').to_string();
assert!(
!mirror.is_empty() && !mirror.contains(".."),
"tests_bridge!: mirror path must be a non-empty literal without `..`, got `{lit}`"
);
let manifest =
PathBuf::from(env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR must be set"));
let abs = manifest
.join("tests")
.join(&mirror)
.join("mod.rs")
.to_string_lossy()
.replace('\\', "/");
format!(r#"#[path = "{abs}"] mod tests;"#)
.parse()
.expect("generated bridge tokens must parse")
}