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}