1use std::time::Duration;
4use serde::{Deserialize, Serialize};
5use service_builder::builder;
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
9#[builder]
10pub struct QueueConfig {
11 #[builder(default = "4", getter)]
13 pub max_workers: usize,
14
15 #[builder(default = "Duration::from_secs(300)", getter)]
17 pub default_timeout: Duration,
18
19 #[builder(default = "Duration::from_millis(100)", getter)]
21 pub poll_interval: Duration,
22
23 #[builder(default = "0", getter)]
25 pub max_queue_size: usize,
26
27 #[builder(default = "true", getter)]
29 pub enable_persistence: bool,
30
31 #[builder(default = "Duration::from_secs(3600)")]
33 pub cleanup_interval: Duration,
34
35 #[builder(default = "Duration::from_secs(86400)")]
37 pub completed_job_ttl: Duration,
38
39 #[builder(default = "Duration::from_secs(604800)")]
41 pub failed_job_ttl: Duration,
42}
43
44impl Default for QueueConfig {
45 fn default() -> Self {
46 Self {
47 max_workers: 4,
48 default_timeout: Duration::from_secs(300),
49 poll_interval: Duration::from_millis(100),
50 max_queue_size: 0,
51 enable_persistence: true,
52 cleanup_interval: Duration::from_secs(3600),
53 completed_job_ttl: Duration::from_secs(86400), failed_job_ttl: Duration::from_secs(604800), }
56 }
57}
58
59#[derive(Debug, Clone, Serialize, Deserialize)]
61#[builder]
62pub struct RedisConfig {
63 #[builder(default = "\"redis://localhost:6379\".to_string()", getter)]
65 pub url: String,
66
67 #[builder(default = "10", getter)]
69 pub pool_size: u32,
70
71 #[builder(default = "Duration::from_secs(5)")]
73 pub connect_timeout: Duration,
74
75 #[builder(default = "Duration::from_secs(30)")]
77 pub command_timeout: Duration,
78
79 #[builder(default = "\"elif_queue\".to_string()")]
81 pub key_prefix: String,
82
83 #[builder(default = "true")]
85 pub enable_persistence: bool,
86}
87
88impl Default for RedisConfig {
89 fn default() -> Self {
90 Self {
91 url: "redis://localhost:6379".to_string(),
92 pool_size: 10,
93 connect_timeout: Duration::from_secs(5),
94 command_timeout: Duration::from_secs(30),
95 key_prefix: "elif_queue".to_string(),
96 enable_persistence: true,
97 }
98 }
99}
100
101impl QueueConfigBuilder {
102 pub fn development() -> Self {
104 QueueConfigBuilder::new()
105 .max_workers(2)
106 .poll_interval(Duration::from_millis(50))
107 .default_timeout(Duration::from_secs(60))
108 .enable_persistence(false)
109 }
110
111 pub fn production() -> Self {
113 QueueConfigBuilder::new()
114 .max_workers(8)
115 .poll_interval(Duration::from_millis(500))
116 .default_timeout(Duration::from_secs(600))
117 .enable_persistence(true)
118 .cleanup_interval(Duration::from_secs(1800)) }
120
121 pub fn testing() -> Self {
123 QueueConfigBuilder::new()
124 .max_workers(1)
125 .poll_interval(Duration::from_millis(10))
126 .default_timeout(Duration::from_secs(10))
127 .enable_persistence(false)
128 .cleanup_interval(Duration::from_secs(1))
129 .completed_job_ttl(Duration::from_secs(1))
130 .failed_job_ttl(Duration::from_secs(1))
131 }
132}
133
134impl RedisConfigBuilder {
135 pub fn development() -> Self {
137 RedisConfigBuilder::new()
138 .url("redis://localhost:6379".to_string())
139 .pool_size(5)
140 .key_prefix("elif_queue_dev".to_string())
141 }
142
143 pub fn production() -> Self {
145 RedisConfigBuilder::new()
146 .pool_size(20)
147 .connect_timeout(Duration::from_secs(10))
148 .command_timeout(Duration::from_secs(60))
149 .key_prefix("elif_queue_prod".to_string())
150 }
151
152 pub fn testing() -> Self {
154 RedisConfigBuilder::new()
155 .url("redis://localhost:6379".to_string())
156 .pool_size(2)
157 .key_prefix("elif_queue_test".to_string())
158 .enable_persistence(false)
159 }
160}
161
162#[cfg(test)]
163mod tests {
164 use super::*;
165
166 #[test]
167 fn test_default_queue_config() {
168 let config = QueueConfig::default();
169 assert_eq!(config.max_workers, 4);
170 assert_eq!(config.default_timeout, Duration::from_secs(300));
171 assert_eq!(config.poll_interval, Duration::from_millis(100));
172 assert!(config.enable_persistence);
173 }
174
175 #[test]
176 fn test_queue_config_builder() {
177 let config = QueueConfigBuilder::new()
178 .max_workers(8)
179 .default_timeout(Duration::from_secs(600))
180 .build().expect("Failed to build config");
181
182 assert_eq!(*config.get_max_workers(), 8);
183 assert_eq!(*config.get_default_timeout(), Duration::from_secs(600));
184 assert_eq!(*config.get_poll_interval(), Duration::from_millis(100)); }
186
187 #[test]
188 fn test_development_config() {
189 let config = QueueConfigBuilder::development().build().expect("Failed to build config");
190 assert_eq!(*config.get_max_workers(), 2);
191 assert_eq!(*config.get_poll_interval(), Duration::from_millis(50));
192 assert!(!*config.get_enable_persistence());
193 }
194
195 #[test]
196 fn test_production_config() {
197 let config = QueueConfigBuilder::production().build().expect("Failed to build config");
198 assert_eq!(*config.get_max_workers(), 8);
199 assert_eq!(*config.get_poll_interval(), Duration::from_millis(500));
200 assert!(*config.get_enable_persistence());
201 }
202
203 #[test]
204 fn test_redis_config_builder() {
205 let config = RedisConfigBuilder::new()
206 .url("redis://custom:6380".to_string())
207 .pool_size(15)
208 .build().expect("Failed to build config");
209
210 assert_eq!(config.get_url(), "redis://custom:6380");
211 assert_eq!(*config.get_pool_size(), 15);
212 }
213}