use std::env;
use std::fs;
use std::io::Write;
use std::path::{Path, PathBuf};
fn main() {
let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR"));
let builtins_dir = manifest_dir.join("builtins");
let out_dir = PathBuf::from(env::var("OUT_DIR").expect("OUT_DIR"));
let dest = out_dir.join("builtins_gen.rs");
let mut files: Vec<(String, PathBuf)> = Vec::new();
collect_lua_files(&builtins_dir, &builtins_dir, &mut files);
files.sort_by(|a, b| a.0.cmp(&b.0));
let mut out = fs::File::create(&dest).expect("create builtins_gen.rs");
writeln!(out, "/// Auto-generated by build.rs — do not edit.").expect("write");
writeln!(out, "pub const FILES: &[(&str, &str)] = &[").expect("write");
for (rel_path, abs_path) in &files {
let rel_unix = rel_path.replace('\\', "/");
writeln!(
out,
" (\"{rel_unix}\", include_str!(\"{}\")),",
abs_path.display()
)
.expect("write");
}
writeln!(out, "];").expect("write");
println!("cargo:rerun-if-changed=builtins");
}
fn collect_lua_files(base: &Path, dir: &Path, out: &mut Vec<(String, PathBuf)>) {
let Ok(entries) = fs::read_dir(dir) else {
return;
};
for entry in entries.flatten() {
let path = entry.path();
if path.is_dir() {
collect_lua_files(base, &path, out);
} else if path.extension().is_some_and(|ext| ext == "lua") {
if let Ok(rel) = path.strip_prefix(base) {
out.push((rel.to_string_lossy().to_string(), path));
}
}
}
}