Skip to main content

rustorm_core/
scope.rs

1use crate::query::QueryBuilder;
2
3/// Именованный переиспользуемый фрагмент запроса.
4///
5/// ```rust
6/// let active = Scope::new(|q| q.filter(|u| u.is_active.is_true()));
7/// User::query().apply(active).fetch_all(&pool).await?;
8/// ```
9pub struct Scope<T> {
10    pub(crate) apply_fn: Box<dyn FnOnce(QueryBuilder<T>) -> QueryBuilder<T> + Send>,
11}
12
13impl<T: Send + Sync + Unpin + 'static> Scope<T> {
14    pub fn new<F>(f: F) -> Self
15    where
16        F: FnOnce(QueryBuilder<T>) -> QueryBuilder<T> + Send + 'static,
17    {
18        Self {
19            apply_fn: Box::new(f),
20        }
21    }
22
23    /// Создаёт пустой scope (no-op).
24    pub fn none() -> Self {
25        Self::new(|q| q)
26    }
27}
28
29/// Трейт для определения scopes на модели.
30/// Пользователь реализует его в `impl UserScopes for User { ... }`.
31pub trait ModelScopes: Sized + Send + Sync + Unpin + 'static {
32    fn scope(s: Scope<Self>) -> crate::query::QueryBuilder<Self>;
33}