use std::sync::OnceLock;
use sqlx::pool::PoolConnection;
use sqlx::{Database, Error, Pool};
use tokio::runtime::Handle;
use crate::home;
#[derive(Debug)]
pub struct Store<DB: Database> {
pool: OnceLock<Pool<DB>>,
home: OnceLock<Handle>,
}
impl<DB: Database> Default for Store<DB> {
fn default() -> Self {
Self {
pool: OnceLock::new(),
home: OnceLock::new(),
}
}
}
impl<DB: Database> From<Pool<DB>> for Store<DB> {
fn from(pool: Pool<DB>) -> Self {
Self {
pool: OnceLock::from(pool),
home: OnceLock::new(),
}
}
}
impl<DB: Database> Store<DB> {
pub(super) fn get(&self) -> Option<&Pool<DB>> {
self.pool.get()
}
pub(super) fn set(&self, pool: Pool<DB>) -> Result<(), Pool<DB>> {
self.pool.set(pool)
}
pub(super) fn learn_home(&self, home: &Handle) {
self.home.get_or_init(|| home.clone());
}
pub(super) async fn acquire(&self, pool: &Pool<DB>) -> Result<PoolConnection<DB>, Error> {
match self.home.get() {
Some(home) => home::acquire(pool, home).await,
None => pool.acquire().await,
}
}
}