use schemars::schema_for;
use serde_json::Value;
use std::path::PathBuf;
const DRAFT_2020_12: &str = "https://json-schema.org/draft/2020-12/schema";
fn apply_must_ignore(value: &mut Value) {
match value {
Value::Object(map) => {
if map.contains_key("properties") {
map.insert("additionalProperties".into(), Value::Bool(true));
}
for (_, v) in map.iter_mut() {
apply_must_ignore(v);
}
}
Value::Array(arr) => {
for v in arr.iter_mut() {
apply_must_ignore(v);
}
}
_ => {}
}
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let cmd = std::env::args()
.nth(1)
.unwrap_or_else(|| "health".to_string());
match cmd.as_str() {
"health" => {
let schema = schema_for!(sqlite_graphrag::commands::health::HealthResponse);
let mut value = serde_json::to_value(&schema)?;
if let Value::Object(map) = &mut value {
map.insert("$schema".into(), Value::String(DRAFT_2020_12.to_string()));
}
apply_must_ignore(&mut value);
let json = serde_json::to_string_pretty(&value)?;
let path = PathBuf::from("docs/schemas/health.schema.json");
std::fs::write(&path, &json)?;
println!("Regenerated {} ({} bytes)", path.display(), json.len());
}
other => {
eprintln!("Unknown schema target: {other}");
eprintln!("Usage: dump_schema <health>");
std::process::exit(2);
}
}
Ok(())
}