subx_cli/core/parallel/
config.rs1use crate::config::{Config, OverflowStrategy};
3use crate::error::SubXError;
4
5#[derive(Debug, Clone)]
7pub struct ParallelConfig {
8 pub max_concurrent_jobs: usize,
10 pub task_queue_size: usize,
12 pub enable_task_priorities: bool,
14 pub auto_balance_workers: bool,
16 pub queue_overflow_strategy: OverflowStrategy,
18}
19
20#[cfg(test)]
21mod tests {
22 use super::*;
23 use crate::config::Config;
24
25 #[test]
26 fn test_parallel_config_validation() {
27 let invalid_jobs = ParallelConfig {
29 max_concurrent_jobs: 0,
30 task_queue_size: 1,
31 enable_task_priorities: true,
32 auto_balance_workers: false,
33 queue_overflow_strategy: OverflowStrategy::Block,
34 };
35 assert!(invalid_jobs.validate().is_err());
36
37 let invalid_queue = ParallelConfig {
38 max_concurrent_jobs: 1,
39 task_queue_size: 0,
40 enable_task_priorities: true,
41 auto_balance_workers: false,
42 queue_overflow_strategy: OverflowStrategy::Block,
43 };
44 assert!(invalid_queue.validate().is_err());
45
46 let valid = ParallelConfig {
47 max_concurrent_jobs: 1,
48 task_queue_size: 1,
49 enable_task_priorities: true,
50 auto_balance_workers: false,
51 queue_overflow_strategy: OverflowStrategy::Block,
52 };
53 assert!(valid.validate().is_ok());
54 }
55
56 #[test]
57 fn test_from_app_config_defaults() {
58 let app_cfg = Config::default();
59 let pc = ParallelConfig::from_app_config(&app_cfg);
60 assert_eq!(pc.max_concurrent_jobs, app_cfg.general.max_concurrent_jobs);
61 assert_eq!(pc.task_queue_size, app_cfg.parallel.task_queue_size);
62 assert_eq!(
63 pc.enable_task_priorities,
64 app_cfg.parallel.enable_task_priorities
65 );
66 assert_eq!(
67 pc.auto_balance_workers,
68 app_cfg.parallel.auto_balance_workers
69 );
70 assert_eq!(
71 pc.queue_overflow_strategy,
72 app_cfg.parallel.overflow_strategy
73 );
74 }
75}
76
77impl ParallelConfig {
78 pub fn from_app_config(config: &Config) -> Self {
80 let p = &config.parallel;
81 Self {
82 max_concurrent_jobs: config.general.max_concurrent_jobs,
83 task_queue_size: p.task_queue_size,
84 enable_task_priorities: p.enable_task_priorities,
85 auto_balance_workers: p.auto_balance_workers,
86 queue_overflow_strategy: p.overflow_strategy.clone(),
87 }
88 }
89
90 pub fn validate(&self) -> Result<(), SubXError> {
92 if self.max_concurrent_jobs == 0 {
93 return Err(SubXError::config(
94 "Max concurrent jobs (max_concurrent_jobs) must be greater than 0",
95 ));
96 }
97 if self.task_queue_size == 0 {
98 return Err(SubXError::config(
99 "Queue size (task_queue_size) must be greater than 0",
100 ));
101 }
102 Ok(())
104 }
105}