1use anyhow::Result;
2use sqlx::{Encode, FromRow, Pool, Type};
3
4use crate::query::{Pagination, QueryResult, Statement};
5
6#[allow(async_fn_in_trait)]
7pub trait Executor {
8 type T: sqlx::Database;
9
10 async fn new(url: &str) -> Self where Self: Sized;
11
12 fn db<'q>(&'q self) -> &'q Pool<Self::T>;
13
14 fn to_sql<'q>(&self, statement: &'q Statement<'q, Self::T>) -> Result<String>;
15
16 async fn execute<'q>(&self, sql: &'q str) -> Result<impl QueryResult>;
17
18 async fn insert<'q>(&self, statement: &'q Statement<'q, Self::T>) -> Result<()>;
19
20 async fn update<'q>(&self, statement: &'q Statement<'q, Self::T>) -> Result<()>;
21
22 async fn count<'q>(&self, statement: &'q Statement<'q, Self::T>) -> Result<u64>;
23
24 async fn delete<'q>(&self, statement: &'q Statement<'q, Self::T>) -> Result<()>;
25
26 async fn insert_as<'q, O>(&self, statement: &'q Statement<'q, Self::T>) -> Result<O>
27 where
28 O: for<'r> FromRow<'r, <Self::T as sqlx::Database>::Row> + Send + Unpin + Sized;
29
30 async fn query_all<'q, O, T: 'q + Encode<'q, Self::T> + Type<Self::T>>(&self, sql: &str, args: Vec<T>) -> Result<Vec<O>>
31 where
32 O: for<'r> FromRow<'r, <Self::T as sqlx::Database>::Row> + Send + Unpin + Sized;
33
34 async fn query_one<'q, O, T: 'q + Encode<'q, Self::T> + Type<Self::T>>(&self, sql: &str, args: Vec<T>) -> Result<O>
35 where
36 O: for<'r> FromRow<'r, <Self::T as sqlx::Database>::Row> + Send + Unpin + Sized;
37
38 async fn all<'q, O>(&self, statement: &'q Statement<'q, Self::T>) -> Result<Vec<O>>
39 where
40 O: for<'r> FromRow<'r, <Self::T as sqlx::Database>::Row> + Send + Unpin + Sized;
41
42 async fn first<'q, O>(&self, statement: &'q Statement<'q, Self::T>) -> Result<O>
43 where
44 O: for<'r> FromRow<'r, <Self::T as sqlx::Database>::Row> + Send + Unpin + Sized;
45
46 async fn paginate<'q, O>(&self, statement: &'q Statement<'q, Self::T>) -> Result<Pagination<O>>
47 where
48 O: for<'r> FromRow<'r, <Self::T as sqlx::Database>::Row> + Send + Unpin + Sized;
49}