Skip to main content

cast_core/
lib.rs

1//! Cast — Eloquent-shaped ORM core on top of sqlx + sea-query.
2
3pub mod column;
4pub mod error;
5pub mod migration;
6pub mod model;
7pub mod paginator;
8pub mod pool;
9pub mod query;
10pub mod relation;
11pub mod schema;
12
13pub use column::{Column, ColumnRef};
14pub use error::{Error, Result};
15pub use migration::MigrationStatus;
16pub use migration::{Migration, MigrationRunner};
17pub use model::{registered_models, Loaded, Model, ModelRegistration};
18pub use paginator::Paginator;
19pub use pool::{connect, Connection, ConnectionManager, Driver, Pool};
20pub use query::QueryBuilder;
21pub use relation::{BelongsTo, HasMany, HasOne, RelationDef, RelationKind};
22pub use schema::{ColumnDef, Schema, Table};
23
24pub use chrono;
25pub use inventory;
26pub use sea_query;
27pub use sea_query_binder;
28pub use sqlx;
29pub use uuid;
30
31/// Define chainable Eloquent-style local scopes on a model's query builder.
32///
33/// Mirrors Laravel's `scopeActive($query)` / `scopePublished($query)` pattern.
34/// Generates a user-named trait and an `impl` for `QueryBuilder<Model>` so
35/// scopes chain directly: `User::query().active().verified().get(pool)`.
36///
37/// ## Usage
38///
39/// ```ignore
40/// use anvilforge::cast::scopes;
41///
42/// scopes!(UserScopes for User {
43///     fn active(q) -> q.where_eq(User::columns().active(), true);
44///     fn verified(q) -> q.where_not_null(User::columns().email_verified_at());
45///     fn older_than(q, days: i32) -> q.where_lt(User::columns().created_at(), cutoff(days));
46/// });
47///
48/// // In handler code:
49/// use crate::app::Models::UserScopes;
50/// let active_verified = User::query().active().verified().get(pool).await?;
51/// ```
52#[macro_export]
53macro_rules! scopes {
54    (
55        $trait_name:ident for $model:ty {
56            $(
57                fn $scope:ident ( $q:ident $(, $arg:ident : $arg_ty:ty )* )
58                    -> $body:expr
59            );* $(;)?
60        }
61    ) => {
62        pub trait $trait_name {
63            $(
64                fn $scope(self $(, $arg: $arg_ty)*) -> Self;
65            )*
66        }
67
68        impl $trait_name for $crate::QueryBuilder<$model> {
69            $(
70                fn $scope(self $(, $arg: $arg_ty)*) -> Self {
71                    let $q = self;
72                    $body
73                }
74            )*
75        }
76    };
77}