orcs-app 0.1.1

ORCS Application Layer - Re-exports and AppError
Documentation
//! Scans `builtins/` directory and generates `builtins_gen.rs` with
//! a `FILES` array of `(relative_path, source)` pairs using `include_str!`.
//!
//! Adding a file to `builtins/` is all that's needed — no Rust-side registration.

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));
            }
        }
    }
}