Skip to main content

mant_engine/query/
prepared.rs

1//! A borrowed proof that complete request validation preceded environment capture.
2use super::{
3    DocumentResolver, LoadPolicy, QueryError, QueryExecutionError, QueryRequest, QueryViewResult,
4    ResolvedContent, validate_query_request,
5};
6
7/// A complete request validated without loading documents or capturing a snapshot.
8///
9/// The request and policy remain bound for this value's lifetime. Preparation
10/// does not cache a search matcher: pure query APIs retain their own validation.
11pub struct PreparedQueryRequest<'request> {
12    request: &'request QueryRequest,
13    policy: LoadPolicy,
14}
15
16impl<'request> PreparedQueryRequest<'request> {
17    /// Validate both source selection and the requested view before local IO.
18    ///
19    /// # Errors
20    /// Returns the same loading-selection or view errors as complete execution.
21    pub fn new(request: &'request QueryRequest, policy: LoadPolicy) -> Result<Self, QueryError> {
22        validate_query_request(request, policy)?;
23        Ok(Self { request, policy })
24    }
25
26    /// The immutable request whose input and view were validated together.
27    #[must_use]
28    pub const fn request(&self) -> &'request QueryRequest {
29        self.request
30    }
31
32    /// The source-selection policy included in validation.
33    #[must_use]
34    pub const fn policy(&self) -> LoadPolicy {
35        self.policy
36    }
37
38    /// Resolve against an explicit snapshot without repeating request validation.
39    ///
40    /// # Errors
41    /// Returns a source-loading failure.
42    pub fn resolve(&self, resolver: &DocumentResolver) -> Result<ResolvedContent, QueryError> {
43        resolver.resolve_validated(self.request, self.policy)
44    }
45
46    /// Execute the shared complete-request pipeline against an explicit snapshot.
47    ///
48    /// # Errors
49    /// Returns loading, projection or pure query execution failure.
50    pub fn execute(
51        &self,
52        resolver: &DocumentResolver,
53    ) -> Result<QueryViewResult, QueryExecutionError> {
54        resolver.execute_validated(self.request, self.policy)
55    }
56}