use cratestack_core::{CoolContext, CoolError};
use crate::{Filter, FilterExpr, OrderClause, sqlx};
#[derive(Debug, Clone)]
pub struct ScopedProjectedFindMany<'a, M: 'static, PK: 'static> {
pub(super) request: crate::ProjectedFindMany<'a, M, PK>,
pub(super) ctx: CoolContext,
}
impl<'a, M: 'static, PK: 'static> ScopedProjectedFindMany<'a, M, PK> {
pub(super) fn new(request: crate::ProjectedFindMany<'a, M, PK>, ctx: CoolContext) -> Self {
Self { request, ctx }
}
pub fn where_(mut self, filter: Filter) -> Self {
self.request = self.request.where_(filter);
self
}
pub fn where_expr(mut self, filter: FilterExpr) -> Self {
self.request = self.request.where_expr(filter);
self
}
pub fn where_any(mut self, filters: impl IntoIterator<Item = FilterExpr>) -> Self {
self.request = self.request.where_any(filters);
self
}
pub fn where_optional<F>(mut self, filter: Option<F>) -> Self
where
F: Into<FilterExpr>,
{
self.request = self.request.where_optional(filter);
self
}
pub fn order_by(mut self, clause: OrderClause) -> Self {
self.request = self.request.order_by(clause);
self
}
pub fn limit(mut self, limit: i64) -> Self {
self.request = self.request.limit(limit);
self
}
pub fn offset(mut self, offset: i64) -> Self {
self.request = self.request.offset(offset);
self
}
pub fn for_update(mut self) -> Self {
self.request = self.request.for_update();
self
}
pub async fn run(self) -> Result<Vec<cratestack_sql::Projection<M>>, CoolError>
where
M: crate::FromPartialPgRow,
{
self.request.run(&self.ctx).await
}
pub async fn run_in_tx<'tx>(
self,
tx: &mut sqlx::Transaction<'tx, sqlx::Postgres>,
) -> Result<Vec<cratestack_sql::Projection<M>>, CoolError>
where
M: crate::FromPartialPgRow,
{
self.request.run_in_tx(tx, &self.ctx).await
}
}