use std::{env, fs, path::Path};
fn main() {
println!("cargo:rerun-if-changed=tests/all");
let manifest_dir = env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set");
let manifest_dir = manifest_dir.replace('\\', "/");
let mut mods: Vec<String> = fs::read_dir(Path::new(&manifest_dir).join("tests/all"))
.expect("tests/all directory missing")
.filter_map(|entry| {
let path = entry.ok()?.path();
let name = path.file_name()?.to_str()?.to_owned();
if !name.ends_with(".rs") || name == "main.rs" || name == "_test_common.rs" {
return None;
}
Some(name.trim_end_matches(".rs").to_owned())
})
.collect();
mods.sort();
let mut generated =
String::from("// @generated by build.rs:按 tests/all 目录内容自动生成,勿手改\n");
for m in &mods {
generated.push_str(&format!(
"#[path = \"{manifest_dir}/tests/all/{m}.rs\"]\nmod {m};\n"
));
}
let out_dir = env::var_os("OUT_DIR").expect("OUT_DIR not set");
fs::write(Path::new(&out_dir).join("all_tests.rs"), generated).expect("write all_tests.rs");
}