use crate::types::{BorrowToSql, ToSql, Type}; use crate::{ Client, CopyInWriter, CopyOutReader, Error, Row, RowIter, SimpleQueryMessage, Statement, ToStatement, Transaction, }; mod private { pub trait Sealed {} } /// A trait allowing abstraction over connections and transactions. /// /// This trait is "sealed", and cannot be implemented outside of this crate. pub trait GenericClient: private::Sealed { /// Like `Client::execute`. fn execute(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result where T: ?Sized + ToStatement; /// Like `Client::query`. fn query(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result, Error> where T: ?Sized + ToStatement; /// Like `Client::query_one`. fn query_one(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result where T: ?Sized + ToStatement; /// Like `Client::query_opt`. fn query_opt( &mut self, query: &T, params: &[&(dyn ToSql + Sync)], ) -> Result, Error> where T: ?Sized + ToStatement; /// Like `Client::query_raw`. fn query_raw(&mut self, query: &T, params: I) -> Result, Error> where T: ?Sized + ToStatement, P: BorrowToSql, I: IntoIterator, I::IntoIter: ExactSizeIterator; /// Like `Client::prepare`. fn prepare(&mut self, query: &str) -> Result; /// Like `Client::prepare_typed`. fn prepare_typed(&mut self, query: &str, types: &[Type]) -> Result; /// Like `Client::copy_in`. fn copy_in(&mut self, query: &T) -> Result, Error> where T: ?Sized + ToStatement; /// Like `Client::copy_out`. fn copy_out(&mut self, query: &T) -> Result, Error> where T: ?Sized + ToStatement; /// Like `Client::simple_query`. fn simple_query(&mut self, query: &str) -> Result, Error>; /// Like `Client::batch_execute`. fn batch_execute(&mut self, query: &str) -> Result<(), Error>; /// Like `Client::transaction`. fn transaction(&mut self) -> Result, Error>; } impl private::Sealed for Client {} impl GenericClient for Client { fn execute(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result where T: ?Sized + ToStatement, { self.execute(query, params) } fn query(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result, Error> where T: ?Sized + ToStatement, { self.query(query, params) } fn query_one(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result where T: ?Sized + ToStatement, { self.query_one(query, params) } fn query_opt( &mut self, query: &T, params: &[&(dyn ToSql + Sync)], ) -> Result, Error> where T: ?Sized + ToStatement, { self.query_opt(query, params) } fn query_raw(&mut self, query: &T, params: I) -> Result, Error> where T: ?Sized + ToStatement, P: BorrowToSql, I: IntoIterator, I::IntoIter: ExactSizeIterator, { self.query_raw(query, params) } fn prepare(&mut self, query: &str) -> Result { self.prepare(query) } fn prepare_typed(&mut self, query: &str, types: &[Type]) -> Result { self.prepare_typed(query, types) } fn copy_in(&mut self, query: &T) -> Result, Error> where T: ?Sized + ToStatement, { self.copy_in(query) } fn copy_out(&mut self, query: &T) -> Result, Error> where T: ?Sized + ToStatement, { self.copy_out(query) } fn simple_query(&mut self, query: &str) -> Result, Error> { self.simple_query(query) } fn batch_execute(&mut self, query: &str) -> Result<(), Error> { self.batch_execute(query) } fn transaction(&mut self) -> Result, Error> { self.transaction() } } impl private::Sealed for Transaction<'_> {} impl GenericClient for Transaction<'_> { fn execute(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result where T: ?Sized + ToStatement, { self.execute(query, params) } fn query(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result, Error> where T: ?Sized + ToStatement, { self.query(query, params) } fn query_one(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result where T: ?Sized + ToStatement, { self.query_one(query, params) } fn query_opt( &mut self, query: &T, params: &[&(dyn ToSql + Sync)], ) -> Result, Error> where T: ?Sized + ToStatement, { self.query_opt(query, params) } fn query_raw(&mut self, query: &T, params: I) -> Result, Error> where T: ?Sized + ToStatement, P: BorrowToSql, I: IntoIterator, I::IntoIter: ExactSizeIterator, { self.query_raw(query, params) } fn prepare(&mut self, query: &str) -> Result { self.prepare(query) } fn prepare_typed(&mut self, query: &str, types: &[Type]) -> Result { self.prepare_typed(query, types) } fn copy_in(&mut self, query: &T) -> Result, Error> where T: ?Sized + ToStatement, { self.copy_in(query) } fn copy_out(&mut self, query: &T) -> Result, Error> where T: ?Sized + ToStatement, { self.copy_out(query) } fn simple_query(&mut self, query: &str) -> Result, Error> { self.simple_query(query) } fn batch_execute(&mut self, query: &str) -> Result<(), Error> { self.batch_execute(query) } fn transaction(&mut self) -> Result, Error> { self.transaction() } }