fn main()

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(())
}