use std::{fs, path::Path};
const HEADER: &str = "\
// @generated by `make generate-proto` from proto/monty/v1/monty.proto — DO NOT EDIT.
#![allow(clippy::allow_attributes, clippy::pedantic, clippy::use_self, clippy::absolute_paths, missing_docs)]
";
const ORACLE_HEADER: &str = "\
// @generated by `make generate-proto` from proto/monty/v1/monty.proto — DO NOT EDIT.
#![allow(clippy::allow_attributes, clippy::pedantic, clippy::use_self, clippy::absolute_paths, missing_docs, dead_code)]
";
fn main() {
let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR"));
let proto_dir = manifest_dir.join("proto");
let proto_file = proto_dir.join("monty/v1/monty.proto");
let descriptors = protox::compile([&proto_file], [&proto_dir]).expect("failed to compile monty.proto");
let out_dir = manifest_dir.join("src/generated");
prost_build::Config::new()
.out_dir(&out_dir)
.extern_path(".monty.v1.MontyObject", "crate::WireObject")
.extern_path(".monty.v1.FunctionCall", "crate::WireFunctionCall")
.compile_fds(descriptors.clone())
.expect("failed to generate Rust code from monty.proto");
prepend_header(&out_dir.join("monty.v1.rs"), HEADER);
let oracle_dir = manifest_dir.join("tests/oracle");
fs::create_dir_all(&oracle_dir).expect("failed to create tests/oracle");
prost_build::Config::new()
.out_dir(&oracle_dir)
.compile_fds(descriptors)
.expect("failed to generate oracle Rust code from monty.proto");
prepend_header(&oracle_dir.join("monty.v1.rs"), ORACLE_HEADER);
}
fn prepend_header(generated: &Path, header: &str) {
let body = fs::read_to_string(generated).expect("generated file missing");
fs::write(generated, format!("{header}{body}")).expect("failed to write generated file");
println!("regenerated {}", generated.display());
}