use crate::Result;
use crate::SelectQueryBuilder;
use futures::future::BoxFuture;
pub trait Insert<DB>
where
Self: Sized + Send + Sync,
DB: sqlx::Database,
{
type Model;
fn insert<'e, A>(self, conn: A) -> BoxFuture<'e, Result<Self::Model>>
where
A: 'e + Send + sqlx::Acquire<'e, Database = DB>;
}
pub trait ModelBuilder<'a, DB>
where
Self: Sized + Send + Sync,
DB: sqlx::Database,
{
type Model;
fn insert<'e: 'a, E>(self, db: E) -> BoxFuture<'a, Result<Self::Model>>
where
E: 'e + sqlx::Executor<'e, Database = DB>;
fn update<'e: 'a, E>(self, db: E) -> BoxFuture<'a, Result<Self::Model>>
where
E: 'e + sqlx::Executor<'e, Database = DB>;
fn modified_fields(&self) -> Vec<&'static str>;
fn build(self) -> Self::Model;
}
pub trait Model<DB>
where
DB: sqlx::Database,
Self: Sized + TableMeta,
{
type ModelBuilder<'a>: ModelBuilder<'a, DB>
where
Self: 'a;
fn insert<'a, A>(self, conn: A) -> crate::insert::Insertion<'a, A, Self, DB>
where
A: 'a + Send + sqlx::Acquire<'a, Database = DB>,
Self: Send;
fn insert_many<'e, E>(values: Vec<Self>, db: E) -> BoxFuture<'e, Result<Vec<Self>>>
where
E: 'e + sqlx::Executor<'e, Database = DB>;
fn update_all_fields<'e, E>(self, db: E) -> BoxFuture<'e, Result<Self>>
where
E: 'e + Send + sqlx::Executor<'e, Database = DB>;
fn delete<'e, E>(self, db: E) -> BoxFuture<'e, Result<()>>
where
E: 'e + sqlx::Executor<'e, Database = DB>;
fn fetch_one<'e, 'a, Arg, E>(id: Arg, db: E) -> BoxFuture<'e, Result<Self>>
where
'a: 'e,
E: 'e + sqlx::Executor<'e, Database = DB>,
Arg: 'a + Send + sqlx::Encode<'a, DB> + sqlx::Type<DB>;
fn query(query: &str) -> sqlx::query::QueryAs<'_, DB, Self, DB::Arguments<'_>>;
fn select<'args>() -> SelectQueryBuilder<'args, DB, Self>;
fn update_partial(&self) -> Self::ModelBuilder<'_>;
fn builder() -> Self::ModelBuilder<'static>;
}
pub trait TableMeta {
fn table_name() -> &'static str;
fn table_columns() -> &'static [&'static str];
fn primary_key() -> Option<&'static str>;
fn primary_key_placeholder_idx() -> Option<usize> {
let col = Self::primary_key()?;
Self::table_columns().iter().position(|&c| c == col).map(|i| i + 1)
}
}