in compiler-rs/openapi_to_clients_schema/src/main.rs [26:72]
fn main() -> anyhow::Result<()> {
let subscriber = FmtSubscriber::builder().with_max_level(Level::TRACE).finish();
tracing::subscriber::set_global_default(subscriber)?;
let args: Vec<String> = env::args().collect();
let path = match args.len() - 1 {
0 => "../../../ent-search/swagger/enterprise-search.json",
1 => &args[1],
_ => return Err(anyhow::anyhow!("expected a single argument")),
};
info!("Loading OpenAPI from {path}");
let data = std::fs::read_to_string(path)?;
// Track unused fields, to find any additional stuff the OpenAPI model would miss
let mut unused = BTreeSet::new();
let open_api = match Path::new(path).extension() {
Some(ext) if ext == "json" => {
let mut deser = serde_json::Deserializer::from_str(&data);
serde_ignored::deserialize(&mut deser, |path| {
unused.insert(path.to_string());
})
.map_err(From::from)
}
Some(ext) if ext == "yml" || ext == "yaml" => {
let deser = serde_yml::Deserializer::from_str(&data);
serde_ignored::deserialize(deser, |path| {
unused.insert(path.to_string());
})
.map_err(From::from)
}
_ => Err(anyhow::anyhow!(format!("Unsupported file extension {:?}", path))),
}?;
if !unused.is_empty() {
println!("Unused fields in the OpenAPI schema: {:?}", unused);
}
let sch_json = openapi_to_clients_schema::generate(&OpenAPI(open_api))?;
let dest = PathBuf::from(path).with_extension("schema.json");
let output = std::fs::File::create(dest)?;
serde_json::to_writer_pretty(output, &sch_json)?;
Ok(())
}