#![allow(clippy::needless_lifetimes, clippy::elidable_lifetime_names)]
use crate::future::BoxFuture;
use std::future::Future;
use crate::connection::{ConnectionConfig, DynConnection};
use crate::error::Result;
pub trait DatabaseDriver: Send + Sync {
fn name(&self) -> &'static str;
fn display_name(&self) -> &'static str;
fn validate(&self, config: &ConnectionConfig) -> Vec<String> {
let _ = config;
Vec::new()
}
fn connect(
&self,
config: &ConnectionConfig,
password: Option<&str>,
) -> impl Future<Output = Result<Box<dyn DynConnection>>> + Send;
}
pub trait DynDatabaseDriver: Send + Sync {
fn name(&self) -> &'static str;
fn display_name(&self) -> &'static str;
fn validate(&self, config: &ConnectionConfig) -> Vec<String>;
fn connect<'a>(
&'a self,
config: &'a ConnectionConfig,
password: Option<&'a str>,
) -> BoxFuture<'a, Result<Box<dyn DynConnection>>>;
}
impl<T> DynDatabaseDriver for T
where
T: DatabaseDriver + 'static,
{
fn name(&self) -> &'static str {
<Self as DatabaseDriver>::name(self)
}
fn display_name(&self) -> &'static str {
<Self as DatabaseDriver>::display_name(self)
}
fn validate(&self, config: &ConnectionConfig) -> Vec<String> {
<Self as DatabaseDriver>::validate(self, config)
}
fn connect<'a>(
&'a self,
config: &'a ConnectionConfig,
password: Option<&'a str>,
) -> BoxFuture<'a, Result<Box<dyn DynConnection>>> {
Box::pin(<Self as DatabaseDriver>::connect(self, config, password))
}
}