alex/volcanic
Automated vulkan bindings
BRANCH main
SNAPSHOT Improved loading api and made ready for publish
DOWNLOAD
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)
}