use schemars::{JsonSchema, Schema, SchemaGenerator};
#[derive(JsonSchema)]
#[serde(untagged)]
#[allow(dead_code)]
enum PathList {
One(String),
Many(Vec<String>),
}
#[derive(JsonSchema)]
#[serde(deny_unknown_fields)]
#[allow(dead_code)]
struct ProjectTable {
name: Option<String>,
version: Option<String>,
}
#[derive(JsonSchema)]
#[serde(deny_unknown_fields)]
#[allow(dead_code)]
struct PathsTable {
include: Option<PathList>,
#[schemars(extend("default" = []))]
exclude: Option<PathList>,
}
#[derive(JsonSchema)]
#[serde(deny_unknown_fields)]
#[allow(dead_code)]
struct LspTable {
#[schemars(extend("enum" = ["live", "on_save"], "default" = "live"))]
diagnostics_mode: Option<String>,
#[schemars(extend("default" = 300))]
diagnostics_debounce_ms: Option<u64>,
}
#[derive(JsonSchema)]
#[serde(deny_unknown_fields)]
#[allow(dead_code)]
struct WorkersTable {
#[schemars(extend("default" = []))]
compatibility_flags: Option<Vec<String>>,
}
#[derive(JsonSchema)]
#[serde(deny_unknown_fields)]
#[allow(dead_code)]
struct UnstableTable {
#[schemars(extend("default" = []))]
allow: Option<Vec<String>>,
}
#[derive(JsonSchema)]
#[serde(deny_unknown_fields)]
#[allow(dead_code)]
struct TestTable {
targets: Option<std::collections::BTreeMap<String, TestTargetTable>>,
}
#[derive(JsonSchema)]
#[serde(deny_unknown_fields)]
#[allow(dead_code)]
struct TestTargetTable {
url: std::collections::BTreeMap<String, String>,
#[schemars(extend("default" = []))]
secrets: Option<Vec<String>>,
vars: Option<std::collections::BTreeMap<String, String>>,
#[schemars(extend("default" = false))]
production: Option<bool>,
}
pub fn table_schema(name: &str, generator: &mut SchemaGenerator) -> Option<Schema> {
Some(match name {
"project" => generator.subschema_for::<ProjectTable>(),
"paths" => generator.subschema_for::<PathsTable>(),
"lsp" => generator.subschema_for::<LspTable>(),
"workers" => generator.subschema_for::<WorkersTable>(),
"unstable" => generator.subschema_for::<UnstableTable>(),
"test" => generator.subschema_for::<TestTable>(),
_ => return None,
})
}