use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum DetectionMode {
None,
RuleBased,
AgentBased,
}
impl Default for DetectionMode {
fn default() -> Self {
Self::None
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OrchestratorConfig {
pub max_step_remediations: usize,
pub max_total_redesigns: usize,
pub min_step_interval: Duration,
pub enable_fast_path_intent_generation: bool,
pub max_total_loop_iterations: usize,
#[serde(default = "default_true")]
pub enable_validation: bool,
#[serde(default)]
pub detection_mode: DetectionMode,
}
fn default_true() -> bool {
true
}
impl Default for OrchestratorConfig {
fn default() -> Self {
Self {
max_step_remediations: 3,
max_total_redesigns: 10,
min_step_interval: Duration::ZERO,
enable_fast_path_intent_generation: false,
max_total_loop_iterations: 50,
enable_validation: true,
detection_mode: DetectionMode::None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_config() {
let config = OrchestratorConfig::default();
assert_eq!(config.max_step_remediations, 3);
assert_eq!(config.max_total_redesigns, 10);
assert_eq!(config.min_step_interval, Duration::ZERO);
assert!(!config.enable_fast_path_intent_generation); assert_eq!(config.max_total_loop_iterations, 50);
assert!(config.enable_validation); }
#[test]
fn test_partial_override() {
let config = OrchestratorConfig {
max_step_remediations: 5,
..Default::default()
};
assert_eq!(config.max_step_remediations, 5);
assert_eq!(config.max_total_redesigns, 10); }
#[test]
fn test_clone() {
let config1 = OrchestratorConfig::default();
let config2 = config1.clone();
assert_eq!(config1.max_step_remediations, config2.max_step_remediations);
assert_eq!(config1.max_total_redesigns, config2.max_total_redesigns);
assert_eq!(config1.min_step_interval, config2.min_step_interval);
assert_eq!(
config1.enable_fast_path_intent_generation,
config2.enable_fast_path_intent_generation
);
assert_eq!(
config1.max_total_loop_iterations,
config2.max_total_loop_iterations
);
assert_eq!(config1.enable_validation, config2.enable_validation);
}
#[test]
fn test_min_step_interval_configuration() {
let config = OrchestratorConfig {
min_step_interval: Duration::from_millis(500),
..Default::default()
};
assert_eq!(config.min_step_interval, Duration::from_millis(500));
assert_eq!(config.max_step_remediations, 3); assert_eq!(config.max_total_redesigns, 10); }
#[test]
fn test_min_step_interval_zero() {
let config = OrchestratorConfig::default();
assert!(config.min_step_interval.is_zero());
}
#[test]
fn test_enable_fast_path_intent_generation_default() {
let config = OrchestratorConfig::default();
assert!(!config.enable_fast_path_intent_generation); }
#[test]
fn test_enable_fast_path_intent_generation_override() {
let config = OrchestratorConfig {
enable_fast_path_intent_generation: true, ..Default::default()
};
assert!(config.enable_fast_path_intent_generation);
assert_eq!(config.max_step_remediations, 3); assert_eq!(config.max_total_redesigns, 10); }
}