use super::types::AggregationStrategy;
use crate::resources::Resource;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PolicyConfig {
pub allow_multiple_active: bool,
pub max_active_policies: Option<usize>,
pub enable_cycling: bool,
pub aggregation_strategies: HashMap<String, AggregationStrategy>,
pub default_aggregation: AggregationStrategy,
}
impl Default for PolicyConfig {
fn default() -> Self {
Self {
allow_multiple_active: false,
max_active_policies: None,
enable_cycling: true,
aggregation_strategies: HashMap::new(),
default_aggregation: AggregationStrategy::Multiply,
}
}
}
impl Resource for PolicyConfig {}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_config() {
let config = PolicyConfig::default();
assert!(!config.allow_multiple_active);
assert_eq!(config.max_active_policies, None);
assert!(config.enable_cycling);
assert!(config.aggregation_strategies.is_empty());
assert_eq!(config.default_aggregation, AggregationStrategy::Multiply);
}
#[test]
fn test_custom_config() {
let mut config = PolicyConfig {
allow_multiple_active: true,
max_active_policies: Some(3),
enable_cycling: false,
..Default::default()
};
config
.aggregation_strategies
.insert("income_multiplier".into(), AggregationStrategy::Multiply);
assert!(config.allow_multiple_active);
assert_eq!(config.max_active_policies, Some(3));
assert!(!config.enable_cycling);
assert_eq!(config.aggregation_strategies.len(), 1);
}
}