use std::{env, fs, path::PathBuf};
fn main() {
let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR"));
let candidates = [
manifest_dir.join("spec/openapi.yaml"), manifest_dir.join("../../spec/openapi.yaml"), ];
let spec_path = candidates
.iter()
.find(|p| p.exists())
.unwrap_or_else(|| {
panic!(
"spec/openapi.yaml not found at any of: {}",
candidates
.iter()
.map(|p| p.display().to_string())
.collect::<Vec<_>>()
.join(", ")
)
});
let out_dir = PathBuf::from(env::var("OUT_DIR").expect("OUT_DIR"));
let out_path = out_dir.join("codegen.rs");
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-changed={}", spec_path.display());
let raw = fs::read_to_string(spec_path)
.unwrap_or_else(|e| panic!("read spec at {}: {e}", spec_path.display()));
let normalized =
taskfast_codegen::normalize_spec(&raw).unwrap_or_else(|e| panic!("normalize spec: {e:#}"));
let spec: openapiv3::OpenAPI = serde_yaml::from_str(&normalized)
.unwrap_or_else(|e| panic!("parse normalized spec as OpenAPI: {e}"));
let mut generator = progenitor::Generator::default();
let tokens = generator
.generate_tokens(&spec)
.unwrap_or_else(|e| panic!("progenitor generate_tokens: {e}"));
let ast: syn::File =
syn::parse2(tokens).unwrap_or_else(|e| panic!("parse generated tokens: {e}"));
let rendered = prettyplease::unparse(&ast);
fs::write(&out_path, rendered)
.unwrap_or_else(|e| panic!("write codegen.rs at {}: {e}", out_path.display()));
}