iridium-db 0.3.0

A high-performance vector-graph hybrid storage and indexing engine
use std::env;
use std::path::{Path, PathBuf};
use std::process::Command;

fn main() {
    let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").expect("manifest dir"));
    let schema_path = manifest_dir.join("src/features/storage/schema/iridium.fbs");

    println!("cargo:rerun-if-changed={}", schema_path.display());
    println!("cargo:rustc-check-cfg=cfg(has_zig)");

    generate_flatbuffers(&schema_path, &manifest_dir);

    if env::var("CARGO_FEATURE_ZIG").is_ok() {
        build_zig(&manifest_dir);
        println!("cargo:rustc-cfg=has_zig");
    }
}

fn generate_flatbuffers(schema_path: &Path, manifest_dir: &Path) {
    let out_dir = PathBuf::from(env::var("OUT_DIR").expect("OUT_DIR"));
    let status = Command::new("flatc")
        .arg("--rust")
        .arg("-o")
        .arg(&out_dir)
        .arg(schema_path)
        .status()
        .expect("failed to invoke flatc");

    if !status.success() {
        panic!("flatc failed. Ensure FlatBuffers compiler is installed.");
    }

    let generated = out_dir.join("iridium_generated.rs");
    if !generated.exists() {
        panic!("flatc did not emit expected iridium_generated.rs");
    }

    let schema_dir = manifest_dir.join("src/features/storage/schema");
    println!("cargo:rerun-if-changed={}", schema_dir.display());
}

fn build_zig(manifest_dir: &Path) {
    let out_dir = PathBuf::from(env::var("OUT_DIR").expect("OUT_DIR"));
    let zig_src = manifest_dir.join("zig/iridium.zig");
    let zig_out = out_dir.join("libiridium_zig.a");
    let zig_cache = out_dir.join("zig-cache");

    println!("cargo:rerun-if-changed={}", zig_src.display());

    let status = Command::new("zig")
        .arg("build-lib")
        .arg("-OReleaseFast")
        .arg("-fPIC")
        .arg("-fno-omit-frame-pointer")
        .arg(zig_src)
        .arg(format!("-femit-bin={}", zig_out.display()))
        .env("ZIG_GLOBAL_CACHE_DIR", &zig_cache)
        .env("ZIG_LOCAL_CACHE_DIR", &zig_cache)
        .status()
        .expect("failed to invoke zig");

    if !status.success() {
        panic!("zig build-lib failed. Ensure Zig is installed and usable.");
    }

    println!("cargo:rustc-link-search=native={}", out_dir.display());
    println!("cargo:rustc-link-lib=static=iridium_zig");
}