mant-protocol 0.8.0

Transport-neutral query contracts, projections, and presentations for ManT
Documentation
//! Generates discoverable JSON Schemas from the authoritative Rust contracts.

use std::collections::BTreeMap;

use schemars::{JsonSchema, Schema, generate::SchemaSettings};

use crate::{
    DoctorReport, DocumentCatalog, QueryBundle, QueryExcerpt, QueryOutline, QueryRequest,
    QuerySearch, ScopeQueryRequest, ScopeQueryResponse,
};

/// Generate the read-only installation health report schema.
#[must_use]
pub fn doctor_report_json_schema() -> Schema {
    serialize_schema::<DoctorReport>()
}

/// Generate the local document-catalog JSON representation.
#[must_use]
pub fn document_catalog_json_schema() -> Schema {
    serialize_schema::<DocumentCatalog>()
}

/// Generate the JSON representation accepted when deserializing a request.
#[must_use]
pub fn query_request_json_schema() -> Schema {
    deserialize_schema::<QueryRequest>()
}

/// Generate the complete-query JSON representation emitted by `mant`.
#[must_use]
pub fn query_bundle_json_schema() -> Schema {
    serialize_schema::<QueryBundle>()
}

/// Generate the outline JSON representation emitted by `mant`.
#[must_use]
pub fn query_outline_json_schema() -> Schema {
    serialize_schema::<QueryOutline>()
}

/// Generate the selected-excerpt JSON representation emitted by `mant`.
#[must_use]
pub fn query_excerpt_json_schema() -> Schema {
    serialize_schema::<QueryExcerpt>()
}

/// Generate the structure-aware search result emitted by `mant`.
#[must_use]
pub fn query_search_json_schema() -> Schema {
    serialize_schema::<QuerySearch>()
}

/// Generate the bounded multi-document request representation.
#[must_use]
pub fn scope_query_request_json_schema() -> Schema {
    deserialize_schema::<ScopeQueryRequest>()
}

/// Generate the bounded multi-document result representation.
#[must_use]
pub fn scope_query_response_json_schema() -> Schema {
    serialize_schema::<ScopeQueryResponse>()
}

/// Generate every public request and query-response contract in stable order.
#[must_use]
pub fn query_json_schema_catalog() -> BTreeMap<&'static str, Schema> {
    BTreeMap::from([
        ("catalog", document_catalog_json_schema()),
        ("excerpt", query_excerpt_json_schema()),
        ("outline", query_outline_json_schema()),
        ("query", query_bundle_json_schema()),
        ("request", query_request_json_schema()),
        ("search", query_search_json_schema()),
        ("scope-query", scope_query_response_json_schema()),
        ("scope-request", scope_query_request_json_schema()),
    ])
}

fn deserialize_schema<T: JsonSchema>() -> Schema {
    SchemaSettings::draft2020_12()
        .for_deserialize()
        .into_generator()
        .into_root_schema_for::<T>()
}

fn serialize_schema<T: JsonSchema>() -> Schema {
    SchemaSettings::draft2020_12()
        .for_serialize()
        .into_generator()
        .into_root_schema_for::<T>()
}