Documentation
use std::{
    env,
    path::{Path, PathBuf},
};

fn iverilog(out_dir: &Path) {
    let repo = PathBuf::from("repos/iverilog");
    std::fs::copy(repo.join("vpi_user.h"), out_dir.join("vpi_user.h")).unwrap();
    std::fs::copy(repo.join("_pli_types.h.in"), out_dir.join("_pli_types.h")).unwrap();
    let bindings = bindgen::Builder::default()
        .header(out_dir.join("vpi_user.h").to_string_lossy())
        .use_core()
        .derive_default(true)
        .generate()
        .expect("Unable to generate bindings");

    bindings
        .write_to_file(out_dir.join("vpi_user.rs"))
        .expect("Couldn't write bindings!");
}

fn verilator(out_dir: &Path) {
    let bindings = bindgen::Builder::default()
        .header("repos/verilator/include/vltstd/vpi_user.h")
        .use_core()
        .derive_default(true)
        .generate()
        .expect("Unable to generate bindings");

    bindings
        .write_to_file(out_dir.join("vpi_user.rs"))
        .expect("Couldn't write bindings!");
}

fn ghdl(out_dir: &Path) {
    let bindings = bindgen::Builder::default()
        .header("repos/ghdl/src/grt/vpi_user.h")
        .use_core()
        .derive_default(true)
        .generate()
        .expect("Unable to generate bindings");

    bindings
        .write_to_file(out_dir.join("vpi_user.rs"))
        .expect("Couldn't write bindings!");
}

fn main() {
    let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap());
    if cfg!(feature = "ghdl") {
        ghdl(&out_dir);
    } else if cfg!(feature = "iverilog") {
        iverilog(&out_dir);
    } else {
        verilator(&out_dir);
    }
}