Skip to main content

haematite_cli/serve/query/
check.rs

1//! Language answers depend only on the request text and the word table.
2
3use serde::{Deserialize, Serialize};
4use serde_json::{Value, json};
5
6use super::{parser, words as vocabulary};
7use crate::serve::storage::Failure;
8
9#[derive(Debug, Serialize, Deserialize)]
10#[serde(deny_unknown_fields)]
11pub struct CheckRequest {
12    pub query: String,
13}
14
15#[derive(Debug, Serialize, Deserialize)]
16#[serde(deny_unknown_fields)]
17pub struct WordsRequest {}
18
19#[must_use]
20pub fn check(request: &CheckRequest) -> Value {
21    let mut stages = Vec::new();
22    let parsed = parser::pipeline_with(&request.query, |word, span| {
23        stages.push(json!({"word": word, "span": {"start": span.start, "end": span.end}}));
24    });
25    let refusal = parsed.err().map(|refused| {
26        let span = refused.span();
27        json!({
28            "code": refused.code(),
29            "message": refused.to_string(),
30            "span": {"start": span.start, "end": span.end}
31        })
32    });
33    json!({"stages": stages, "refusal": refusal})
34}
35
36/// Serialize the served query word table.
37///
38/// # Errors
39/// Returns `storage_unavailable` if serializing the word table fails.
40pub fn words(request: &WordsRequest) -> Result<Value, Failure> {
41    let WordsRequest {} = request;
42    serde_json::to_value(vocabulary::WORDS).map_err(Failure::storage)
43}