use crate::config::{env, env_optional};
#[derive(Debug, Clone)]
pub struct CacheConfig {
pub url: String,
pub prefix: String,
pub default_ttl: u64,
}
impl CacheConfig {
pub fn from_env() -> Self {
Self {
url: env_optional("REDIS_URL").unwrap_or_else(|| "redis://127.0.0.1:6379".to_string()),
prefix: env("REDIS_PREFIX", "ferro_cache:".to_string()),
default_ttl: env("CACHE_DEFAULT_TTL", 3600),
}
}
pub fn builder() -> CacheConfigBuilder {
CacheConfigBuilder::default()
}
}
impl Default for CacheConfig {
fn default() -> Self {
Self::from_env()
}
}
#[derive(Debug, Default)]
pub struct CacheConfigBuilder {
url: Option<String>,
prefix: Option<String>,
default_ttl: Option<u64>,
}
impl CacheConfigBuilder {
pub fn url(mut self, url: impl Into<String>) -> Self {
self.url = Some(url.into());
self
}
pub fn prefix(mut self, prefix: impl Into<String>) -> Self {
self.prefix = Some(prefix.into());
self
}
pub fn default_ttl(mut self, seconds: u64) -> Self {
self.default_ttl = Some(seconds);
self
}
pub fn build(self) -> CacheConfig {
let defaults = CacheConfig::from_env();
CacheConfig {
url: self.url.unwrap_or(defaults.url),
prefix: self.prefix.unwrap_or(defaults.prefix),
default_ttl: self.default_ttl.unwrap_or(defaults.default_ttl),
}
}
}