use std::fmt::Display;
use uuid::Uuid;
pub trait DatabaseContext<Conn> {
fn connection(&self) -> &Conn;
fn connection_mut(&mut self) -> &mut Conn;
fn config(&self) -> &DatabaseConfig;
}
#[derive(Debug, Clone)]
pub struct DefaultDatabaseContext<Conn> {
pub connection: Conn,
pub config: DatabaseConfig,
}
impl<Conn> DefaultDatabaseContext<Conn> {
pub fn new(connection: Conn, config: DatabaseConfig) -> Self {
Self { connection, config }
}
}
impl<Conn> DatabaseContext<Conn> for DefaultDatabaseContext<Conn> {
fn connection(&self) -> &Conn {
&self.connection
}
fn connection_mut(&mut self) -> &mut Conn {
&mut self.connection
}
fn config(&self) -> &DatabaseConfig {
&self.config
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DatabaseConfig {
pub admin_url: String,
pub user_url: String,
}
impl DatabaseConfig {
pub fn new(admin_url: impl Into<String>, user_url: impl Into<String>) -> Self {
Self {
admin_url: admin_url.into(),
user_url: user_url.into(),
}
}
pub fn from_env() -> std::result::Result<Self, std::env::VarError> {
let admin_url = std::env::var("ADMIN_DATABASE_URL")?;
let user_url = std::env::var("DATABASE_URL")?;
Ok(Self::new(admin_url, user_url))
}
}
#[derive(Debug, Clone)]
pub struct DatabaseName(String);
impl DatabaseName {
pub fn new(prefix: Option<&str>) -> Self {
let uuid = Uuid::new_v4();
let safe_uuid = uuid.to_string().replace('-', "_");
Self(format!("{}_{}", prefix.unwrap_or("testkit"), safe_uuid))
}
pub fn as_str(&self) -> &str {
&self.0
}
}
impl Display for DatabaseName {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}