1use crate::config::{env, env_optional};
4
5#[derive(Debug, Clone)]
28pub struct CacheConfig {
29 pub url: String,
31 pub prefix: String,
33 pub default_ttl: u64,
35}
36
37impl CacheConfig {
38 pub fn from_env() -> Self {
40 Self {
41 url: env_optional("REDIS_URL").unwrap_or_else(|| "redis://127.0.0.1:6379".to_string()),
42 prefix: env("REDIS_PREFIX", "ferro_cache:".to_string()),
43 default_ttl: env("CACHE_DEFAULT_TTL", 3600),
44 }
45 }
46
47 pub fn builder() -> CacheConfigBuilder {
49 CacheConfigBuilder::default()
50 }
51}
52
53impl Default for CacheConfig {
54 fn default() -> Self {
55 Self::from_env()
56 }
57}
58
59#[derive(Debug, Default)]
61pub struct CacheConfigBuilder {
62 url: Option<String>,
63 prefix: Option<String>,
64 default_ttl: Option<u64>,
65}
66
67impl CacheConfigBuilder {
68 pub fn url(mut self, url: impl Into<String>) -> Self {
70 self.url = Some(url.into());
71 self
72 }
73
74 pub fn prefix(mut self, prefix: impl Into<String>) -> Self {
76 self.prefix = Some(prefix.into());
77 self
78 }
79
80 pub fn default_ttl(mut self, seconds: u64) -> Self {
82 self.default_ttl = Some(seconds);
83 self
84 }
85
86 pub fn build(self) -> CacheConfig {
88 let defaults = CacheConfig::from_env();
89 CacheConfig {
90 url: self.url.unwrap_or(defaults.url),
91 prefix: self.prefix.unwrap_or(defaults.prefix),
92 default_ttl: self.default_ttl.unwrap_or(defaults.default_ttl),
93 }
94 }
95}