Skip to main content

mant_protocol/
schema.rs

1//! Generates discoverable JSON Schemas from the authoritative Rust contracts.
2
3use std::collections::BTreeMap;
4
5use schemars::{JsonSchema, Schema, generate::SchemaSettings};
6
7use crate::{
8    DoctorReport, DocumentCatalog, QueryBundle, QueryExcerpt, QueryOutline, QueryRequest,
9    QuerySearch, ScopeQueryRequest, ScopeQueryResponse,
10};
11
12/// Generate the read-only installation health report schema.
13#[must_use]
14pub fn doctor_report_json_schema() -> Schema {
15    serialize_schema::<DoctorReport>()
16}
17
18/// Generate the local document-catalog JSON representation.
19#[must_use]
20pub fn document_catalog_json_schema() -> Schema {
21    serialize_schema::<DocumentCatalog>()
22}
23
24/// Generate the JSON representation accepted when deserializing a request.
25#[must_use]
26pub fn query_request_json_schema() -> Schema {
27    deserialize_schema::<QueryRequest>()
28}
29
30/// Generate the complete-query JSON representation emitted by `mant`.
31#[must_use]
32pub fn query_bundle_json_schema() -> Schema {
33    serialize_schema::<QueryBundle>()
34}
35
36/// Generate the outline JSON representation emitted by `mant`.
37#[must_use]
38pub fn query_outline_json_schema() -> Schema {
39    serialize_schema::<QueryOutline>()
40}
41
42/// Generate the selected-excerpt JSON representation emitted by `mant`.
43#[must_use]
44pub fn query_excerpt_json_schema() -> Schema {
45    serialize_schema::<QueryExcerpt>()
46}
47
48/// Generate the structure-aware search result emitted by `mant`.
49#[must_use]
50pub fn query_search_json_schema() -> Schema {
51    serialize_schema::<QuerySearch>()
52}
53
54/// Generate the bounded multi-document request representation.
55#[must_use]
56pub fn scope_query_request_json_schema() -> Schema {
57    deserialize_schema::<ScopeQueryRequest>()
58}
59
60/// Generate the bounded multi-document result representation.
61#[must_use]
62pub fn scope_query_response_json_schema() -> Schema {
63    serialize_schema::<ScopeQueryResponse>()
64}
65
66/// Generate every public request and query-response contract in stable order.
67#[must_use]
68pub fn query_json_schema_catalog() -> BTreeMap<&'static str, Schema> {
69    BTreeMap::from([
70        ("catalog", document_catalog_json_schema()),
71        ("excerpt", query_excerpt_json_schema()),
72        ("outline", query_outline_json_schema()),
73        ("query", query_bundle_json_schema()),
74        ("request", query_request_json_schema()),
75        ("search", query_search_json_schema()),
76        ("scope-query", scope_query_response_json_schema()),
77        ("scope-request", scope_query_request_json_schema()),
78    ])
79}
80
81fn deserialize_schema<T: JsonSchema>() -> Schema {
82    SchemaSettings::draft2020_12()
83        .for_deserialize()
84        .into_generator()
85        .into_root_schema_for::<T>()
86}
87
88fn serialize_schema<T: JsonSchema>() -> Schema {
89    SchemaSettings::draft2020_12()
90        .for_serialize()
91        .into_generator()
92        .into_root_schema_for::<T>()
93}