Skip to main content

sql_splitter/
json_schema.rs

1//! JSON Schema generation for CLI output types.
2//!
3//! This module provides schema generation for all commands that support --json output.
4//! Schemas are generated using the schemars crate and can be exported via the `schema` subcommand.
5
6use schemars::{generate::SchemaSettings, transform::RestrictFormats, Schema};
7use std::collections::BTreeMap;
8
9/// Returns all JSON schemas for commands that support --json output.
10/// Uses BTreeMap for deterministic ordering (important for diffable output).
11pub fn all_schemas() -> BTreeMap<&'static str, Schema> {
12    let settings = SchemaSettings::default().with_transform(RestrictFormats::default());
13    let generator = settings.into_generator();
14
15    let mut schemas = BTreeMap::new();
16
17    schemas.insert(
18        "analyze",
19        generator
20            .clone()
21            .into_root_schema_for::<crate::cmd::analyze::AnalyzeJsonOutput>(),
22    );
23
24    schemas.insert(
25        "convert",
26        generator
27            .clone()
28            .into_root_schema_for::<crate::cmd::convert::ConvertJsonOutput>(),
29    );
30
31    schemas.insert(
32        "graph",
33        generator
34            .clone()
35            .into_root_schema_for::<crate::graph::format::json::ErdJson>(),
36    );
37
38    schemas.insert(
39        "merge",
40        generator
41            .clone()
42            .into_root_schema_for::<crate::cmd::merge::MergeJsonOutput>(),
43    );
44
45    schemas.insert(
46        "redact",
47        generator
48            .clone()
49            .into_root_schema_for::<crate::redactor::RedactStats>(),
50    );
51
52    schemas.insert(
53        "sample",
54        generator
55            .clone()
56            .into_root_schema_for::<crate::cmd::sample::SampleJsonOutput>(),
57    );
58
59    schemas.insert(
60        "shard",
61        generator
62            .clone()
63            .into_root_schema_for::<crate::cmd::shard::ShardJsonOutput>(),
64    );
65
66    schemas.insert(
67        "split",
68        generator
69            .clone()
70            .into_root_schema_for::<crate::cmd::split::SplitJsonOutput>(),
71    );
72
73    schemas.insert(
74        "validate",
75        generator.into_root_schema_for::<crate::validate::ValidationSummary>(),
76    );
77
78    schemas
79}
80
81/// Generate a single schema by command name.
82pub fn get_schema(command: &str) -> Option<Schema> {
83    all_schemas().remove(command)
84}
85
86/// List all available schema names.
87pub fn schema_names() -> Vec<&'static str> {
88    all_schemas().keys().copied().collect()
89}