use std::future::Future;
use crate::client::Client;
use crate::command::Command;
use crate::dataset::DataSet;
use crate::error::Result;
use crate::row::Row;
use crate::transaction::Transaction;
use crate::value::{FromSql, ToSql};
mod sealed {
pub trait Sealed {
fn as_client(&mut self) -> &mut crate::client::Client;
}
}
pub(crate) use sealed::Sealed;
impl Sealed for Client {
fn as_client(&mut self) -> &mut Client {
self
}
}
impl Sealed for Transaction<'_> {
fn as_client(&mut self) -> &mut Client {
self.client_mut()
}
}
impl<T: Sealed + ?Sized> Sealed for &mut T {
fn as_client(&mut self) -> &mut Client {
(**self).as_client()
}
}
pub trait Executor: Sealed + Send {
fn transaction(&mut self) -> impl Future<Output = Result<Transaction<'_>>> + Send;
fn query(
&mut self,
sql: &str,
params: &[&dyn ToSql],
) -> impl Future<Output = Result<Vec<Row>>> + Send {
self.as_client().query(sql, params)
}
fn query_one(
&mut self,
sql: &str,
params: &[&dyn ToSql],
) -> impl Future<Output = Result<Row>> + Send {
self.as_client().query_one(sql, params)
}
fn query_opt(
&mut self,
sql: &str,
params: &[&dyn ToSql],
) -> impl Future<Output = Result<Option<Row>>> + Send {
self.as_client().query_opt(sql, params)
}
fn query_scalar<T: FromSql + Send>(
&mut self,
sql: &str,
params: &[&dyn ToSql],
) -> impl Future<Output = Result<T>> + Send {
self.as_client().query_scalar(sql, params)
}
fn execute(
&mut self,
sql: &str,
params: &[&dyn ToSql],
) -> impl Future<Output = Result<u64>> + Send {
self.as_client().execute(sql, params)
}
fn batch(&mut self, sql: &str) -> impl Future<Output = Result<Vec<Row>>> + Send {
self.as_client().batch(sql)
}
fn batch_dataset(&mut self, sql: &str) -> impl Future<Output = Result<DataSet>> + Send {
self.as_client().batch_dataset(sql)
}
fn query_dataset(&mut self, command: &Command) -> impl Future<Output = Result<DataSet>> + Send {
self.as_client().query_dataset(command)
}
fn execute_command(&mut self, command: &Command) -> impl Future<Output = Result<u64>> + Send {
self.as_client().execute_command(command)
}
}
impl Executor for Client {
fn transaction(&mut self) -> impl Future<Output = Result<Transaction<'_>>> + Send {
Client::transaction(self)
}
}
impl Executor for Transaction<'_> {
fn transaction(&mut self) -> impl Future<Output = Result<Transaction<'_>>> + Send {
Transaction::transaction(self)
}
}
impl<T: Executor + ?Sized> Executor for &mut T {
fn transaction(&mut self) -> impl Future<Output = Result<Transaction<'_>>> + Send {
(**self).transaction()
}
}