1use 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#[must_use]
14pub fn doctor_report_json_schema() -> Schema {
15 serialize_schema::<DoctorReport>()
16}
17
18#[must_use]
20pub fn document_catalog_json_schema() -> Schema {
21 serialize_schema::<DocumentCatalog>()
22}
23
24#[must_use]
26pub fn query_request_json_schema() -> Schema {
27 deserialize_schema::<QueryRequest>()
28}
29
30#[must_use]
32pub fn query_bundle_json_schema() -> Schema {
33 serialize_schema::<QueryBundle>()
34}
35
36#[must_use]
38pub fn query_outline_json_schema() -> Schema {
39 serialize_schema::<QueryOutline>()
40}
41
42#[must_use]
44pub fn query_excerpt_json_schema() -> Schema {
45 serialize_schema::<QueryExcerpt>()
46}
47
48#[must_use]
50pub fn query_search_json_schema() -> Schema {
51 serialize_schema::<QuerySearch>()
52}
53
54#[must_use]
56pub fn scope_query_request_json_schema() -> Schema {
57 deserialize_schema::<ScopeQueryRequest>()
58}
59
60#[must_use]
62pub fn scope_query_response_json_schema() -> Schema {
63 serialize_schema::<ScopeQueryResponse>()
64}
65
66#[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}