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>>,
workers_dev: Option<bool>,
}
#[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>,
}
#[derive(JsonSchema)]
#[serde(deny_unknown_fields)]
#[allow(dead_code)]
struct PackageTable {
#[schemars(extend("pattern" = "^[a-z][a-z0-9-]*/[a-z][a-z0-9_]*$"))]
name: String,
version: Option<String>,
description: Option<String>,
license: Option<String>,
repository: Option<String>,
exports: Option<Vec<String>>,
}
#[derive(JsonSchema)]
#[serde(deny_unknown_fields)]
#[allow(dead_code)]
struct DependencyEntry {
package: String,
version: Option<String>,
git: Option<String>,
rev: Option<String>,
path: Option<String>,
}
#[derive(JsonSchema)]
#[schemars(extend("propertyNames" = { "pattern": "^[a-z][a-z0-9_]*$" }))]
#[allow(dead_code)]
struct DependenciesTable(std::collections::BTreeMap<String, DependencyEntry>);
#[derive(JsonSchema)]
#[schemars(extend("propertyNames" = { "pattern": "^[a-z][a-z0-9_]*$" }))]
#[allow(dead_code)]
struct DevDependenciesTable(std::collections::BTreeMap<String, DependencyEntry>);
#[derive(JsonSchema)]
#[serde(deny_unknown_fields)]
#[allow(dead_code)]
struct RegistryEntry {
index: String,
organisations: Option<Vec<String>>,
#[serde(rename = "mirror-of")]
mirror_of: Option<String>,
key: Option<String>,
}
#[derive(JsonSchema)]
#[schemars(extend("propertyNames" = { "pattern": "^[a-z][a-z0-9-]*$" }))]
#[allow(dead_code)]
struct RegistriesTable(std::collections::BTreeMap<String, RegistryEntry>);
#[derive(JsonSchema)]
#[serde(deny_unknown_fields)]
#[allow(dead_code)]
struct WorkspaceTable {
members: Vec<String>,
#[schemars(extend("default" = []))]
exclude: Option<Vec<String>>,
}
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>(),
"package" => generator.subschema_for::<PackageTable>(),
"workspace" => generator.subschema_for::<WorkspaceTable>(),
"dependencies" => generator.subschema_for::<DependenciesTable>(),
"dev-dependencies" => generator.subschema_for::<DevDependenciesTable>(),
"registries" => generator.subschema_for::<RegistriesTable>(),
_ => return None,
})
}