Skip to main content

ferro_rs/cache/
config.rs

1//! Cache configuration for Ferro framework
2
3use crate::config::{env, env_optional};
4
5/// Cache configuration
6///
7/// # Environment Variables
8///
9/// - `REDIS_URL` - Redis connection URL (default: redis://127.0.0.1:6379)
10/// - `REDIS_PREFIX` - Key prefix for cache entries (default: "ferro_cache:")
11/// - `CACHE_DEFAULT_TTL` - Default TTL in seconds, 0 = no expiration (default: 3600)
12///
13/// # Example
14///
15/// ```rust,ignore
16/// use ferro_rs::{Config, CacheConfig};
17///
18/// // Register from environment
19/// Config::register(CacheConfig::from_env());
20///
21/// // Or build manually
22/// Config::register(CacheConfig::builder()
23///     .url("redis://localhost:6379")
24///     .prefix("myapp:")
25///     .build());
26/// ```
27#[derive(Debug, Clone)]
28pub struct CacheConfig {
29    /// Redis connection URL
30    pub url: String,
31    /// Key prefix for all cache entries
32    pub prefix: String,
33    /// Default TTL in seconds (0 = no expiration)
34    pub default_ttl: u64,
35}
36
37impl CacheConfig {
38    /// Create configuration from environment variables
39    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    /// Create a builder for manual configuration
48    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/// Builder for CacheConfig
60#[derive(Debug, Default)]
61pub struct CacheConfigBuilder {
62    url: Option<String>,
63    prefix: Option<String>,
64    default_ttl: Option<u64>,
65}
66
67impl CacheConfigBuilder {
68    /// Set the Redis URL
69    pub fn url(mut self, url: impl Into<String>) -> Self {
70        self.url = Some(url.into());
71        self
72    }
73
74    /// Set the key prefix
75    pub fn prefix(mut self, prefix: impl Into<String>) -> Self {
76        self.prefix = Some(prefix.into());
77        self
78    }
79
80    /// Set the default TTL in seconds
81    pub fn default_ttl(mut self, seconds: u64) -> Self {
82        self.default_ttl = Some(seconds);
83        self
84    }
85
86    /// Build the configuration
87    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}