build.rs
1 use arroyo_api::ApiDoc; 2 use progenitor::{GenerationSettings, InterfaceStyle}; 3 use std::path::PathBuf; 4 use std::{env, fs}; 5 use utoipa::OpenApi; 6 7 fn main() { 8 // Generate the OpenAPI spec 9 let api_spec = "../../target/api-spec.json"; 10 11 let doc = ApiDoc::openapi().to_pretty_json().unwrap(); 12 fs::write(&api_spec, &doc).unwrap(); 13 14 let spec = serde_json::from_str(&doc).unwrap(); 15 let mut settings = GenerationSettings::new(); 16 settings.with_interface(InterfaceStyle::Builder); 17 let mut generator = progenitor::Generator::new(&settings); 18 19 let tokens = generator.generate_tokens(&spec).unwrap(); 20 let ast = syn::parse2(tokens).unwrap(); 21 let content = prettyplease::unparse(&ast); 22 23 let generated = PathBuf::from(env::var("OUT_DIR").unwrap()).join("generated"); 24 fs::create_dir_all(&generated).unwrap(); 25 fs::write(generated.join("api-client.rs"), content).unwrap(); 26 }