use crate::backend::DatabaseBackend;
use crate::error::Result;
use crate::router::DatabaseRouter;
use crate::router_key::router_key;
use async_trait::async_trait;
use std::any::Any;
use std::sync::Arc;
#[derive(Debug, Clone, Default)]
pub struct ResolverContext {
pub environment: Option<String>,
}
#[async_trait]
pub trait DatabaseEvaluator: Send + Sync + std::fmt::Debug + Any + 'static {
fn logical_name(&self) -> &'static str;
fn name(&self) -> &'static str {
self.logical_name()
}
fn engine_id(&self) -> &'static str;
async fn resolve(
&self,
ctx: &ResolverContext,
router: &DatabaseRouter,
) -> Result<Arc<dyn DatabaseBackend>>;
fn as_any(&self) -> &dyn Any;
}
#[derive(Debug, Clone, Copy)]
pub struct DatabaseFromEngine {
logical_name: &'static str,
engine_id: &'static str,
}
impl DatabaseFromEngine {
pub const fn new(logical_name: &'static str, engine_id: &'static str) -> Self {
Self {
logical_name,
engine_id,
}
}
}
#[async_trait]
impl DatabaseEvaluator for DatabaseFromEngine {
fn logical_name(&self) -> &'static str {
self.logical_name
}
fn engine_id(&self) -> &'static str {
self.engine_id
}
async fn resolve(
&self,
_ctx: &ResolverContext,
router: &DatabaseRouter,
) -> Result<Arc<dyn DatabaseBackend>> {
let key = router_key(self.logical_name, self.engine_id);
router.resolve(&key)
}
fn as_any(&self) -> &dyn Any {
self
}
}
pub struct Database;
impl Database {
pub const fn from_engine(
logical_name: &'static str,
engine_id: &'static str,
) -> DatabaseFromEngine {
DatabaseFromEngine::new(logical_name, engine_id)
}
}
use crate::known_engines::KnownEngines;
pub const DEFAULT_IN_MEMORY: DatabaseFromEngine =
DatabaseFromEngine::new("default", KnownEngines::INMEMORY_MEM);
pub use crate::router_key::DEFAULT_IN_MEMORY_ROUTER_KEY;