ormlitex_core/
insert.rs

1use futures::future::BoxFuture;
2#[allow(unused_imports)]
3use sqlmo::{Insert, Dialect, ToSql};
4pub use sqlmo::query::OnConflict;
5use crate::Result;
6
7/// Represents an insert query.
8/// We had to turn this into a model because we need to pass in the on_conflict configuration.
9pub struct Insertion<'a, Acquire, Model, DB: sqlx::Database> {
10    pub acquire: Acquire,
11    pub model: Model,
12    pub closure: Box<dyn 'static + Send + FnOnce(Acquire, Model, String) -> BoxFuture<'a, Result<Model>>>,
13    pub insert: Insert,
14    pub _db: std::marker::PhantomData<DB>,
15}
16
17
18impl<'a, Acquire, Model, DB: sqlx::Database> Insertion<'a, Acquire, Model, DB> {
19    pub fn on_conflict(mut self, c: OnConflict) -> Self {
20        self.insert.on_conflict = c;
21        self
22    }
23}
24
25
26#[cfg(feature = "sqlite")]
27impl<'a, Acquire, Model> std::future::IntoFuture for Insertion<'a, Acquire, Model, sqlx::sqlite::Sqlite>
28    where
29        Model: for<'r> sqlx::FromRow<'r, sqlx::sqlite::SqliteRow> + Send + Unpin,
30        Acquire: Send,
31{
32    type Output = Result<Model>;
33    type IntoFuture = BoxFuture<'a, Self::Output>;
34
35    fn into_future(self) -> Self::IntoFuture {
36        let q = self.insert.to_sql(Dialect::Sqlite);
37        (self.closure)(self.acquire, self.model, q)
38    }
39}
40
41#[cfg(feature = "postgres")]
42impl<'a, Acquire, Model> std::future::IntoFuture for Insertion<'a, Acquire, Model, sqlx::postgres::Postgres>
43    where
44        Model: for<'r> sqlx::FromRow<'r, sqlx::postgres::PgRow> + Send + Unpin
45{
46    type Output = Result<Model>;
47    type IntoFuture = BoxFuture<'a, Self::Output>;
48
49    fn into_future(self) -> Self::IntoFuture {
50        let q = self.insert.to_sql(Dialect::Postgres);
51        (self.closure)(self.acquire, self.model, q)
52    }
53}