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, TldrCacheUpdate,
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 explicit tldr cache update result schema.
19#[must_use]
20pub fn tldr_cache_update_json_schema() -> Schema {
21    serialize_schema::<TldrCacheUpdate>()
22}
23
24/// Generate the local document-catalog JSON representation.
25#[must_use]
26pub fn document_catalog_json_schema() -> Schema {
27    serialize_schema::<DocumentCatalog>()
28}
29
30/// Generate the JSON representation accepted when deserializing a request.
31#[must_use]
32pub fn query_request_json_schema() -> Schema {
33    deserialize_schema::<QueryRequest>()
34}
35
36/// Generate the complete-query JSON representation emitted by `mant`.
37#[must_use]
38pub fn query_bundle_json_schema() -> Schema {
39    serialize_schema::<QueryBundle>()
40}
41
42/// Generate the outline JSON representation emitted by `mant`.
43#[must_use]
44pub fn query_outline_json_schema() -> Schema {
45    serialize_schema::<QueryOutline>()
46}
47
48/// Generate the selected-excerpt JSON representation emitted by `mant`.
49#[must_use]
50pub fn query_excerpt_json_schema() -> Schema {
51    serialize_schema::<QueryExcerpt>()
52}
53
54/// Generate the independent semantic-evidence response representation.
55#[must_use]
56pub fn query_explanation_json_schema() -> Schema {
57    serialize_schema::<crate::QueryExplanation>()
58}
59
60/// Generate the structure-aware search result emitted by `mant`.
61#[must_use]
62pub fn query_search_json_schema() -> Schema {
63    serialize_schema::<QuerySearch>()
64}
65
66/// Generate the bounded multi-document request representation.
67#[must_use]
68pub fn scope_query_request_json_schema() -> Schema {
69    deserialize_schema::<ScopeQueryRequest>()
70}
71
72/// Generate the bounded multi-document result representation.
73#[must_use]
74pub fn scope_query_response_json_schema() -> Schema {
75    serialize_schema::<ScopeQueryResponse>()
76}
77
78/// Generate every public request and query-response contract in stable order.
79#[must_use]
80pub fn query_json_schema_catalog() -> BTreeMap<&'static str, Schema> {
81    BTreeMap::from([
82        ("catalog", document_catalog_json_schema()),
83        ("doctor", doctor_report_json_schema()),
84        ("excerpt", query_excerpt_json_schema()),
85        ("explanation", query_explanation_json_schema()),
86        ("outline", query_outline_json_schema()),
87        ("query", query_bundle_json_schema()),
88        ("request", query_request_json_schema()),
89        ("search", query_search_json_schema()),
90        ("scope-query", scope_query_response_json_schema()),
91        ("scope-request", scope_query_request_json_schema()),
92        ("tldr-update", tldr_cache_update_json_schema()),
93    ])
94}
95
96fn deserialize_schema<T: JsonSchema>() -> Schema {
97    SchemaSettings::draft2020_12()
98        .for_deserialize()
99        .into_generator()
100        .into_root_schema_for::<T>()
101}
102
103fn serialize_schema<T: JsonSchema>() -> Schema {
104    SchemaSettings::draft2020_12()
105        .for_serialize()
106        .into_generator()
107        .into_root_schema_for::<T>()
108}