cartel-pg 0.1.0

Async PostgreSQL driver for the dope runtime
use std::future::Future;

use dope::manifold::connector::source::Dialer;
use dope::manifold::env::Env;
use dope::transport::Transport;

use crate::{Dispatched, Error, ExtractUnit, Fiber, PgHolding, PgOps, QuerySet};

pub trait PgRawExt<'d, I, S, E>: PgOps<'d, I, S, E>
where
    I: QuerySet + 'd,
    S: Dialer<E::Transport> + 'd,
    E: Env + 'd,
    E::Transport: Transport<Addr: Clone>,
{
    fn execute_raw(
        &self,
        sql: &str,
    ) -> Fiber<'d, impl Future<Output = Result<(), Error>> + use<'d, Self, I, S, E>> {
        let dispatched: Dispatched<'d, I, S, E, ExtractUnit> = self.dispatch_sql(sql);
        Fiber::new(dispatched)
    }

    fn migrate(
        &self,
        stmts: &'static [&'static str],
    ) -> Fiber<'d, impl Future<Output = Result<(), Error>> + use<'d, Self, I, S, E>> {
        let holding: PgHolding<'d, I, S, E> = self.holding();
        Fiber::new(async move {
            for sql in stmts {
                holding.dispatch_sql(sql).await?;
            }
            Ok(())
        })
    }
}

impl<'d, I, S, E, T> PgRawExt<'d, I, S, E> for T
where
    T: PgOps<'d, I, S, E>,
    I: QuerySet + 'd,
    S: Dialer<E::Transport> + 'd,
    E: Env + 'd,
    E::Transport: Transport<Addr: Clone>,
{
}