Skip to main content

cratestack_sqlx/delegate/
scoped_find_many_projected.rs

1//! Context-bound wrapper around [`crate::ProjectedFindMany`].
2
3use cratestack_core::{CoolContext, CoolError};
4
5use crate::{Filter, FilterExpr, OrderClause, sqlx};
6
7#[derive(Debug, Clone)]
8pub struct ScopedProjectedFindMany<'a, M: 'static, PK: 'static> {
9    pub(super) request: crate::ProjectedFindMany<'a, M, PK>,
10    pub(super) ctx: CoolContext,
11}
12
13impl<'a, M: 'static, PK: 'static> ScopedProjectedFindMany<'a, M, PK> {
14    pub(super) fn new(request: crate::ProjectedFindMany<'a, M, PK>, ctx: CoolContext) -> Self {
15        Self { request, ctx }
16    }
17
18    pub fn where_(mut self, filter: Filter) -> Self {
19        self.request = self.request.where_(filter);
20        self
21    }
22
23    pub fn where_expr(mut self, filter: FilterExpr) -> Self {
24        self.request = self.request.where_expr(filter);
25        self
26    }
27
28    pub fn where_any(mut self, filters: impl IntoIterator<Item = FilterExpr>) -> Self {
29        self.request = self.request.where_any(filters);
30        self
31    }
32
33    pub fn where_optional<F>(mut self, filter: Option<F>) -> Self
34    where
35        F: Into<FilterExpr>,
36    {
37        self.request = self.request.where_optional(filter);
38        self
39    }
40
41    pub fn order_by(mut self, clause: OrderClause) -> Self {
42        self.request = self.request.order_by(clause);
43        self
44    }
45
46    pub fn limit(mut self, limit: i64) -> Self {
47        self.request = self.request.limit(limit);
48        self
49    }
50
51    pub fn offset(mut self, offset: i64) -> Self {
52        self.request = self.request.offset(offset);
53        self
54    }
55
56    pub fn for_update(mut self) -> Self {
57        self.request = self.request.for_update();
58        self
59    }
60
61    pub async fn run(self) -> Result<Vec<cratestack_sql::Projection<M>>, CoolError>
62    where
63        M: crate::FromPartialPgRow,
64    {
65        self.request.run(&self.ctx).await
66    }
67
68    pub async fn run_in_tx<'tx>(
69        self,
70        tx: &mut sqlx::Transaction<'tx, sqlx::Postgres>,
71    ) -> Result<Vec<cratestack_sql::Projection<M>>, CoolError>
72    where
73        M: crate::FromPartialPgRow,
74    {
75        self.request.run_in_tx(tx, &self.ctx).await
76    }
77}