use convert_case::{Case, Casing};
use std::{env, fs, path::PathBuf};
fn main() {
let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR"));
let src_dir = manifest_dir.join("src");
println!("cargo:rerun-if-changed={}", src_dir.display());
let mut files: Vec<PathBuf> = fs::read_dir(&src_dir)
.expect("read_dir src failed")
.filter_map(|e| e.ok())
.map(|e| e.path())
.filter(|p| p.is_file())
.filter(|p| p.extension().and_then(|s| s.to_str()) == Some("rs"))
.filter(|p| {
let file = p.file_name().and_then(|s| s.to_str()).unwrap_or("");
file != "lib.rs" && file != "mod.rs"
})
.collect();
files.sort_by(|a, b| a.file_name().cmp(&b.file_name()));
let mut out = String::new();
out.push_str("// @generated by build.rs — do not edit manually\n");
for path in files {
let stem = path.file_stem().unwrap().to_str().unwrap();
let mut ident = stem.to_case(Case::Snake);
if ident.chars().next().map_or(false, |c| c.is_ascii_digit()) {
ident.insert(0, '_');
}
out.push_str(&format!("#[path = {:?}]\n", path.to_string_lossy()));
out.push_str(&format!("pub mod {};\n", ident));
out.push_str(&format!("pub use {}::*;\n\n", ident));
}
let out_dir = PathBuf::from(env::var("OUT_DIR").expect("OUT_DIR"));
fs::write(out_dir.join("generated_mods.rs"), out).expect("write generated_mods.rs");
}