elif_cache/
config.rs

1//! Cache configuration and builder
2
3use std::time::Duration;
4use serde::{Deserialize, Serialize};
5use service_builder::builder;
6
7/// Cache configuration for all backends
8#[derive(Debug, Clone, Serialize, Deserialize)]
9#[builder]
10pub struct CacheConfig {
11    /// Default TTL for cache entries
12    #[builder(getter, default = "Some(Duration::from_secs(3600))")]
13    pub default_ttl: Option<Duration>,
14    
15    /// Maximum number of entries (for memory backend)
16    #[builder(getter, default = "Some(10_000)")]
17    pub max_entries: Option<usize>,
18    
19    /// Memory limit in bytes (for memory backend)
20    #[builder(getter, default = "Some(100 * 1024 * 1024)")]
21    pub max_memory: Option<usize>,
22    
23    /// Connection timeout
24    #[builder(default = "Duration::from_secs(5)")]
25    pub connection_timeout: Duration,
26    
27    /// Operation timeout
28    #[builder(default = "Duration::from_secs(1)")]
29    pub operation_timeout: Duration,
30    
31    /// Enable compression for large values
32    #[builder(default)]
33    pub compression: bool,
34    
35    /// Compression threshold (compress values larger than this)
36    #[builder(default = "1024")]
37    pub compression_threshold: usize,
38}
39
40impl Default for CacheConfig {
41    fn default() -> Self {
42        // Use the builder with defaults to ensure consistency
43        CacheConfig::builder()
44            .default_ttl(Some(Duration::from_secs(3600))) // 1 hour
45            .max_entries(Some(10_000))
46            .max_memory(Some(100 * 1024 * 1024)) // 100MB
47            .build()
48            .unwrap()
49    }
50}
51
52// Add convenience methods to the generated builder
53impl CacheConfigBuilder {
54    pub fn default_ttl_duration(self, ttl: Duration) -> Self {
55        self.default_ttl(Some(ttl))
56    }
57    
58    pub fn no_default_ttl(self) -> Self {
59        self.default_ttl(None)
60    }
61    
62    pub fn max_entries_limit(self, max: usize) -> Self {
63        self.max_entries(Some(max))
64    }
65    
66    pub fn unlimited_entries(self) -> Self {
67        self.max_entries(None)
68    }
69    
70    pub fn max_memory_bytes(self, bytes: usize) -> Self {
71        self.max_memory(Some(bytes))
72    }
73    
74    pub fn unlimited_memory(self) -> Self {
75        self.max_memory(None)
76    }
77    
78    pub fn enable_compression(self, threshold: usize) -> Self {
79        self.compression(true).compression_threshold(threshold)
80    }
81    
82    pub fn disable_compression(self) -> Self {
83        self.compression(false)
84    }
85    
86    pub fn build_config(self) -> CacheConfig {
87        self.build_with_defaults().unwrap()
88    }
89}
90
91#[cfg(test)]
92mod tests {
93    use super::*;
94    
95    #[test]
96    fn test_default_config() {
97        let config = CacheConfig::default();
98        assert_eq!(config.default_ttl, Some(Duration::from_secs(3600)));
99        assert_eq!(config.max_entries, Some(10_000));
100        assert!(!config.compression);
101    }
102    
103    #[test]
104    fn test_config_builder() {
105        let config = CacheConfig::builder()
106            .default_ttl_duration(Duration::from_secs(7200))
107            .max_entries_limit(5000)
108            .enable_compression(2048)
109            .build_config();
110            
111        assert_eq!(config.default_ttl, Some(Duration::from_secs(7200)));
112        assert_eq!(config.max_entries, Some(5000));
113        assert!(config.compression);
114        assert_eq!(config.compression_threshold, 2048);
115    }
116}