use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use crate::{
MantDocument, OutlineDetail, SearchCase, SearchScope, SearchSyntax, TldrDocument,
default_search_limit,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub enum QuerySchema {
#[serde(rename = "mant.query/v6")]
V6,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub enum RequestSchema {
#[serde(rename = "mant.request/v6")]
V6,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(
tag = "kind",
rename_all = "kebab-case",
rename_all_fields = "camelCase",
deny_unknown_fields
)]
pub enum QueryInput {
Document {
name: String,
#[serde(skip_serializing_if = "Option::is_none")]
source: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
section: Option<String>,
},
MarkdownFile { path: String },
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(
tag = "kind",
rename_all = "kebab-case",
rename_all_fields = "camelCase",
deny_unknown_fields
)]
pub enum QueryView {
Full {},
Outline {
detail: OutlineDetail,
},
Excerpt {
#[schemars(length(min = 1))]
nodes: Vec<String>,
},
Explain {
#[schemars(length(min = 1))]
entry: String,
},
Search {
#[schemars(length(min = 1, max = 4096))]
pattern: String,
#[serde(default)]
syntax: SearchSyntax,
#[serde(default)]
case: SearchCase,
#[serde(default)]
scope: SearchScope,
#[serde(default)]
word: bool,
#[serde(default)]
#[schemars(range(max = 100))]
context_lines: u16,
#[serde(default = "default_search_limit")]
#[schemars(range(min = 1, max = 10000))]
limit: u32,
#[serde(default)]
offset: u32,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
#[schemars(extend("$id" = "urn:mant:request:v6"))]
pub struct QueryRequest {
pub schema: RequestSchema,
pub input: QueryInput,
pub view: QueryView,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(extend("$id" = "urn:mant:query:v6"))]
pub struct QueryBundle {
pub schema: QuerySchema,
pub label: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub document: Option<MantDocument>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tldr: Option<TldrDocument>,
}