Skip to main content

mant_engine/query/
execution.rs

1//! Query execution boundary; public entry points remain validated.
2use super::{
3    QueryExecutionError, QueryView, QueryViewResult, ResolvedContent, SearchQuery, search_query,
4    select_excerpt,
5};
6
7/// Materialize one view from an already loaded query.
8///
9/// # Errors
10///
11/// Returns a typed projection or search failure.
12pub fn project_query_view(
13    query: ResolvedContent,
14    view: &QueryView,
15) -> Result<QueryViewResult, QueryExecutionError> {
16    validate_query_view(view)
17        .map_err(|error| QueryExecutionError::Query(super::QueryError::QueryValidation(error)))?;
18    match view {
19        QueryView::Full {} => Ok(QueryViewResult::Full(Box::new(query))),
20        QueryView::Outline {
21            entries,
22            root,
23            references,
24        } => {
25            mant_query::build_outline_with_references(
26                &query,
27                entries.clone(),
28                root.clone(),
29                references,
30            )
31        }
32        .map(QueryViewResult::Outline)
33        .map_err(QueryExecutionError::Projection),
34        QueryView::Excerpt { selectors } => select_excerpt(&query, selectors)
35            .map(QueryViewResult::Excerpt)
36            .map_err(QueryExecutionError::Projection),
37        QueryView::Explain { entry, options } => mant_query::explain_query(
38            &query,
39            &mant_protocol::ExplanationQuery {
40                entry: entry.clone(),
41                options: *options,
42            },
43        )
44        .map(QueryViewResult::Explanation)
45        .map_err(|error| {
46            QueryExecutionError::Query(super::QueryError::QueryValidation(
47                super::QueryValidationError::InvalidExplanation(error),
48            ))
49        }),
50        QueryView::Search {
51            pattern,
52            syntax,
53            case,
54            scope,
55            word,
56            context_lines,
57            limit,
58            offset,
59        } => search_query(
60            &query,
61            &SearchQuery {
62                pattern: pattern.clone(),
63                syntax: *syntax,
64                case: *case,
65                scope: *scope,
66                word: *word,
67                context_lines: *context_lines,
68                limit: *limit,
69                offset: *offset,
70            },
71        )
72        .map(QueryViewResult::Search)
73        .map_err(QueryExecutionError::Search),
74    }
75}
76
77use super::validation::validate_query_view;