use crate::config::{env, env_optional};
#[derive(Debug, Clone, PartialEq)]
pub enum DatabaseType {
Postgres,
Sqlite,
Unknown,
}
#[derive(Debug, Clone)]
pub struct DatabaseConfig {
pub url: String,
pub max_connections: u32,
pub min_connections: u32,
pub connect_timeout: u64,
pub logging: bool,
}
impl DatabaseConfig {
pub fn from_env() -> Self {
Self {
url: env_optional("DATABASE_URL")
.unwrap_or_else(|| "sqlite://./database.db".to_string()),
max_connections: env("DB_MAX_CONNECTIONS", 10),
min_connections: env("DB_MIN_CONNECTIONS", 1),
connect_timeout: env("DB_CONNECT_TIMEOUT", 30),
logging: env("DB_LOGGING", false),
}
}
pub fn builder() -> DatabaseConfigBuilder {
DatabaseConfigBuilder::default()
}
pub fn database_type(&self) -> DatabaseType {
if self.url.starts_with("postgres://") || self.url.starts_with("postgresql://") {
DatabaseType::Postgres
} else if self.url.starts_with("sqlite://") || self.url.starts_with("sqlite:") {
DatabaseType::Sqlite
} else {
DatabaseType::Unknown
}
}
pub fn is_configured(&self) -> bool {
self.url != "sqlite://./database.db"
}
}
impl Default for DatabaseConfig {
fn default() -> Self {
Self::from_env()
}
}
#[derive(Debug, Default)]
pub struct DatabaseConfigBuilder {
url: Option<String>,
max_connections: Option<u32>,
min_connections: Option<u32>,
connect_timeout: Option<u64>,
logging: Option<bool>,
}
impl DatabaseConfigBuilder {
pub fn url(mut self, url: impl Into<String>) -> Self {
self.url = Some(url.into());
self
}
pub fn max_connections(mut self, count: u32) -> Self {
self.max_connections = Some(count);
self
}
pub fn min_connections(mut self, count: u32) -> Self {
self.min_connections = Some(count);
self
}
pub fn connect_timeout(mut self, seconds: u64) -> Self {
self.connect_timeout = Some(seconds);
self
}
pub fn logging(mut self, enabled: bool) -> Self {
self.logging = Some(enabled);
self
}
pub fn build(self) -> DatabaseConfig {
let defaults = DatabaseConfig::from_env();
DatabaseConfig {
url: self.url.unwrap_or(defaults.url),
max_connections: self.max_connections.unwrap_or(defaults.max_connections),
min_connections: self.min_connections.unwrap_or(defaults.min_connections),
connect_timeout: self.connect_timeout.unwrap_or(defaults.connect_timeout),
logging: self.logging.unwrap_or(defaults.logging),
}
}
}