Theme

alex/volcanic

Automated vulkan bindings

BRANCH main
main
SNAPSHOT Improved loading api and made ready for publish
DOWNLOAD
Download file

root / codegen / src / main.rs

mod ctype;
mod emit;
mod manifest;
mod output;
mod registry;
mod select;

use std::path::Path;

type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;

fn main() -> Result<()> {
    let mut check = false;
    for arg in std::env::args().skip(1) {
        match arg.as_str() {
            "--check" => check = true,
            "--help" | "-h" => {
                println!(
                    "Usage: codegen [--check]\nRegenerate bindings, or check that generated files are current"
                );
                return Ok(());
            }
            _ => return Err(format!("unknown argument: {arg}").into()),
        }
    }
    let root = Path::new(env!("CARGO_MANIFEST_DIR")).parent().unwrap();
    let vk = registry::Registry::load(root.join("spec/vk.xml"))?;
    let video = registry::Registry::load(root.join("spec/video.xml"))?;
    let generated = emit::generate(&vk, &video);
    let features = select::feature_names(&vk, &video);
    let manifest_path = root.join("volcanic/Cargo.toml");
    let manifest = std::fs::read_to_string(&manifest_path)?;

    // Format every output before modifying tracked files
    let outputs = [
        (
            root.join("volcanic/src/lib.rs"),
            output::format_rust(&generated.lib_rs)?,
        ),
        (
            root.join("volcanic/src/loader/mod.rs"),
            output::format_rust(&generated.loader_rs)?,
        ),
        (
            manifest_path,
            manifest::update_features(&manifest, &features),
        ),
    ];
    output::write_outputs(&outputs, check)
}