1use std::time::Duration;
4use serde::{Deserialize, Serialize};
5use service_builder::builder;
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
9#[builder]
10pub struct CacheConfig {
11 #[builder(getter, default = "Some(Duration::from_secs(3600))")]
13 pub default_ttl: Option<Duration>,
14
15 #[builder(getter, default = "Some(10_000)")]
17 pub max_entries: Option<usize>,
18
19 #[builder(getter, default = "Some(100 * 1024 * 1024)")]
21 pub max_memory: Option<usize>,
22
23 #[builder(default = "Duration::from_secs(5)")]
25 pub connection_timeout: Duration,
26
27 #[builder(default = "Duration::from_secs(1)")]
29 pub operation_timeout: Duration,
30
31 #[builder(default)]
33 pub compression: bool,
34
35 #[builder(default = "1024")]
37 pub compression_threshold: usize,
38}
39
40impl Default for CacheConfig {
41 fn default() -> Self {
42 CacheConfig::builder()
44 .default_ttl(Some(Duration::from_secs(3600))) .max_entries(Some(10_000))
46 .max_memory(Some(100 * 1024 * 1024)) .build()
48 .unwrap()
49 }
50}
51
52impl 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}