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::{DocumentCatalog, QueryBundle, QueryExcerpt, QueryOutline, QueryRequest, QuerySearch};
8
9/// Generate the local document-catalog JSON representation.
10#[must_use]
11pub fn document_catalog_json_schema() -> Schema {
12    serialize_schema::<DocumentCatalog>()
13}
14
15/// Generate the JSON representation accepted when deserializing a request.
16#[must_use]
17pub fn query_request_json_schema() -> Schema {
18    deserialize_schema::<QueryRequest>()
19}
20
21/// Generate the complete-query JSON representation emitted by `mant`.
22#[must_use]
23pub fn query_bundle_json_schema() -> Schema {
24    serialize_schema::<QueryBundle>()
25}
26
27/// Generate the outline JSON representation emitted by `mant`.
28#[must_use]
29pub fn query_outline_json_schema() -> Schema {
30    serialize_schema::<QueryOutline>()
31}
32
33/// Generate the selected-excerpt JSON representation emitted by `mant`.
34#[must_use]
35pub fn query_excerpt_json_schema() -> Schema {
36    serialize_schema::<QueryExcerpt>()
37}
38
39/// Generate the structure-aware search result emitted by `mant`.
40#[must_use]
41pub fn query_search_json_schema() -> Schema {
42    serialize_schema::<QuerySearch>()
43}
44
45/// Generate every public request and query-response contract in stable order.
46#[must_use]
47pub fn query_json_schema_catalog() -> BTreeMap<&'static str, Schema> {
48    BTreeMap::from([
49        ("catalog", document_catalog_json_schema()),
50        ("excerpt", query_excerpt_json_schema()),
51        ("outline", query_outline_json_schema()),
52        ("query", query_bundle_json_schema()),
53        ("request", query_request_json_schema()),
54        ("search", query_search_json_schema()),
55    ])
56}
57
58fn deserialize_schema<T: JsonSchema>() -> Schema {
59    SchemaSettings::draft2020_12()
60        .for_deserialize()
61        .into_generator()
62        .into_root_schema_for::<T>()
63}
64
65fn serialize_schema<T: JsonSchema>() -> Schema {
66    SchemaSettings::draft2020_12()
67        .for_serialize()
68        .into_generator()
69        .into_root_schema_for::<T>()
70}