subx_cli/core/parallel/
config.rs

1//! Parallel processing configuration module
2use crate::config::{Config, OverflowStrategy};
3use crate::error::SubXError;
4
5/// Configuration for parallel processing behavior.
6#[derive(Debug, Clone)]
7pub struct ParallelConfig {
8    /// Maximum number of concurrent jobs (global limit)
9    pub max_concurrent_jobs: usize,
10    /// Maximum task queue size.
11    pub task_queue_size: usize,
12    /// Whether task priorities are enabled.
13    pub enable_task_priorities: bool,
14    /// Whether workers auto-balance according to load.
15    pub auto_balance_workers: bool,
16    /// Strategy to apply when the task queue reaches its maximum size.
17    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        // Test invalid max_concurrent_jobs and task_queue_size settings
28        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    /// Construct ParallelConfig from application Config.
79    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    /// Validate configuration values for correctness.
91    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        // Overflow strategy is always valid.
103        Ok(())
104    }
105}