#[cfg(feature = "sqlx")]
pub mod sqlx;
#[cfg(feature = "diesel")]
pub mod diesel;
mod error;
#[cfg(test)]
mod tests;
pub use error::DatabaseError;
use std::any::Any;
use std::sync::Arc;
#[derive(Clone)]
pub enum Database {
#[cfg(feature = "sqlx")]
Sqlx(Arc<dyn Any + Send + Sync>),
#[cfg(feature = "diesel")]
Diesel(Arc<dyn Any + Send + Sync>),
}
impl Database {
#[cfg(feature = "sqlx")]
pub fn from_sqlx<DB: ::sqlx::Database>(pool: crate::database::sqlx::SqlxPool<DB>) -> Self {
Self::Sqlx(Arc::new(pool))
}
#[cfg(feature = "diesel")]
pub fn from_diesel<Conn>(pool: crate::database::diesel::DieselPool<Conn>) -> Self
where
Conn: ::diesel::Connection + ::diesel::r2d2::R2D2Connection + 'static,
{
Self::Diesel(Arc::new(pool))
}
#[cfg(feature = "sqlx")]
pub fn as_sqlx<DB: ::sqlx::Database>(
&self,
) -> Result<&crate::database::sqlx::SqlxPool<DB>, DatabaseError> {
match self {
Self::Sqlx(pool) => pool
.downcast_ref::<crate::database::sqlx::SqlxPool<DB>>()
.ok_or_else(|| DatabaseError::Connection("Invalid SQLx pool type".into())),
#[allow(unreachable_patterns)]
_ => Err(DatabaseError::NotConfigured),
}
}
#[cfg(feature = "diesel")]
pub fn as_diesel<Conn>(
&self,
) -> Result<&crate::database::diesel::DieselPool<Conn>, DatabaseError>
where
Conn: ::diesel::Connection + ::diesel::r2d2::R2D2Connection + 'static,
{
match self {
Self::Diesel(pool) => pool
.downcast_ref::<crate::database::diesel::DieselPool<Conn>>()
.ok_or_else(|| DatabaseError::Connection("Invalid Diesel pool type".into())),
#[allow(unreachable_patterns)]
_ => Err(DatabaseError::NotConfigured),
}
}
}