subx_cli/config/
builder.rs1use crate::config::test_service::TestConfigService;
7use crate::config::{Config, OverflowStrategy};
8
9pub struct TestConfigBuilder {
26 config: Config,
27}
28
29impl TestConfigBuilder {
30 pub fn new() -> Self {
32 Self {
33 config: Config::default(),
34 }
35 }
36
37 pub fn with_ai_provider(mut self, provider: &str) -> Self {
45 self.config.ai.provider = provider.to_string();
46 self
47 }
48
49 pub fn with_ai_model(mut self, model: &str) -> Self {
55 self.config.ai.model = model.to_string();
56 self
57 }
58
59 pub fn with_ai_api_key(mut self, api_key: &str) -> Self {
65 self.config.ai.api_key = Some(api_key.to_string());
66 self
67 }
68
69 pub fn with_ai_base_url(mut self, base_url: &str) -> Self {
75 self.config.ai.base_url = base_url.to_string();
76 self
77 }
78
79 pub fn with_max_sample_length(mut self, length: usize) -> Self {
85 self.config.ai.max_sample_length = length;
86 self
87 }
88
89 pub fn with_ai_temperature(mut self, temperature: f32) -> Self {
95 self.config.ai.temperature = temperature;
96 self
97 }
98
99 pub fn with_ai_max_tokens(mut self, max_tokens: u32) -> Self {
105 self.config.ai.max_tokens = max_tokens;
106 self
107 }
108
109 pub fn with_ai_retry(mut self, attempts: u32, delay_ms: u64) -> Self {
116 self.config.ai.retry_attempts = attempts;
117 self.config.ai.retry_delay_ms = delay_ms;
118 self
119 }
120
121 pub fn with_ai_request_timeout(mut self, timeout_seconds: u64) -> Self {
127 self.config.ai.request_timeout_seconds = timeout_seconds;
128 self
129 }
130
131 pub fn with_sync_method(mut self, method: &str) -> Self {
139 self.config.sync.default_method = method.to_string();
140 self
141 }
142
143 pub fn with_vad_enabled(mut self, enabled: bool) -> Self {
149 self.config.sync.vad.enabled = enabled;
150 self
151 }
152
153 pub fn with_vad_sensitivity(mut self, sensitivity: f32) -> Self {
159 self.config.sync.vad.sensitivity = sensitivity;
160 self
161 }
162
163 pub fn with_vad_sample_rate(mut self, sample_rate: u32) -> Self {
169 self.config.sync.vad.sample_rate = sample_rate;
170 self
171 }
172
173 pub fn with_default_output_format(mut self, format: &str) -> Self {
181 self.config.formats.default_output = format.to_string();
182 self
183 }
184
185 pub fn with_preserve_styling(mut self, preserve: bool) -> Self {
191 self.config.formats.preserve_styling = preserve;
192 self
193 }
194
195 pub fn with_default_encoding(mut self, encoding: &str) -> Self {
201 self.config.formats.default_encoding = encoding.to_string();
202 self
203 }
204
205 pub fn with_encoding_detection_confidence(mut self, confidence: f32) -> Self {
211 self.config.formats.encoding_detection_confidence = confidence;
212 self
213 }
214
215 pub fn with_backup_enabled(mut self, enabled: bool) -> Self {
223 self.config.general.backup_enabled = enabled;
224 self
225 }
226
227 pub fn with_max_concurrent_jobs(mut self, jobs: usize) -> Self {
233 self.config.general.max_concurrent_jobs = jobs;
234 self
235 }
236
237 pub fn with_task_timeout(mut self, timeout_seconds: u64) -> Self {
243 self.config.general.task_timeout_seconds = timeout_seconds;
244 self
245 }
246
247 pub fn with_progress_bar(mut self, enabled: bool) -> Self {
253 self.config.general.enable_progress_bar = enabled;
254 self
255 }
256
257 pub fn with_worker_idle_timeout(mut self, timeout_seconds: u64) -> Self {
263 self.config.general.worker_idle_timeout_seconds = timeout_seconds;
264 self
265 }
266
267 pub fn with_task_queue_size(mut self, size: usize) -> Self {
275 self.config.parallel.task_queue_size = size;
276 self
277 }
278
279 pub fn with_task_priorities(mut self, enabled: bool) -> Self {
285 self.config.parallel.enable_task_priorities = enabled;
286 self
287 }
288
289 pub fn with_auto_balance_workers(mut self, enabled: bool) -> Self {
295 self.config.parallel.auto_balance_workers = enabled;
296 self
297 }
298
299 pub fn with_queue_overflow_strategy(mut self, strategy: OverflowStrategy) -> Self {
305 self.config.parallel.overflow_strategy = strategy;
306 self
307 }
308
309 pub fn with_parallel_settings(mut self, max_workers: usize, queue_size: usize) -> Self {
311 self.config.general.max_concurrent_jobs = max_workers;
312 self.config.parallel.task_queue_size = queue_size;
313 self
314 }
315
316 pub fn build_service(self) -> TestConfigService {
320 TestConfigService::new(self.config)
321 }
322
323 pub fn build_config(self) -> Config {
325 self.config
326 }
327
328 pub fn config(&self) -> &Config {
330 &self.config
331 }
332
333 pub fn config_mut(&mut self) -> &mut Config {
335 &mut self.config
336 }
337 pub fn with_mock_ai_server(mut self, mock_url: &str) -> Self {
356 self.config.ai.base_url = mock_url.to_string();
357 self.config.ai.api_key = Some("mock-api-key".to_string());
358 self
359 }
360}
361
362impl Default for TestConfigBuilder {
363 fn default() -> Self {
364 Self::new()
365 }
366}
367
368#[cfg(test)]
369mod tests {
370 use super::*;
371 use crate::config::service::ConfigService;
372
373 #[test]
374 fn test_builder_default() {
375 let config = TestConfigBuilder::new().build_config();
376 let default_config = Config::default();
377
378 assert_eq!(config.ai.provider, default_config.ai.provider);
379 assert_eq!(config.ai.model, default_config.ai.model);
380 }
381
382 #[test]
383 fn test_builder_ai_configuration() {
384 let config = TestConfigBuilder::new()
385 .with_ai_provider("anthropic")
386 .with_ai_model("claude-3")
387 .with_ai_api_key("test-key")
388 .with_max_sample_length(5000)
389 .with_ai_temperature(0.7)
390 .build_config();
391
392 assert_eq!(config.ai.provider, "anthropic");
393 assert_eq!(config.ai.model, "claude-3");
394 assert_eq!(config.ai.api_key, Some("test-key".to_string()));
395 assert_eq!(config.ai.max_sample_length, 5000);
396 assert_eq!(config.ai.temperature, 0.7);
397 }
398
399 #[test]
400 fn test_builder_sync_configuration() {
401 let config = TestConfigBuilder::new()
402 .with_sync_method("vad")
403 .with_vad_enabled(true)
404 .with_vad_sensitivity(0.8)
405 .with_vad_sample_rate(32000)
406 .build_config();
407
408 assert_eq!(config.sync.default_method, "vad");
409 assert!(config.sync.vad.enabled);
410 assert_eq!(config.sync.vad.sensitivity, 0.8);
411 assert_eq!(config.sync.vad.sample_rate, 32000);
412 }
413
414 #[test]
415 fn test_builder_service_creation() {
416 let service = TestConfigBuilder::new()
417 .with_ai_provider("test-provider")
418 .build_service();
419
420 let config = service.get_config().unwrap();
421 assert_eq!(config.ai.provider, "test-provider");
422 }
423
424 #[test]
425 fn test_builder_chaining() {
426 let config = TestConfigBuilder::new()
427 .with_ai_provider("openai")
428 .with_ai_model("gpt-4.1")
429 .with_sync_method("vad")
430 .with_vad_sensitivity(0.5)
431 .with_max_concurrent_jobs(8)
432 .with_task_queue_size(200)
433 .build_config();
434
435 assert_eq!(config.ai.provider, "openai");
436 assert_eq!(config.ai.model, "gpt-4.1");
437 assert_eq!(config.sync.default_method, "vad");
438 assert_eq!(config.sync.vad.sensitivity, 0.5);
439 assert_eq!(config.general.max_concurrent_jobs, 8);
440 assert_eq!(config.parallel.task_queue_size, 200);
441 }
442}