Skip to main content

camel_api/
load_balancer.rs

1#[derive(Debug, Clone, Default, PartialEq, Eq)]
2pub enum LoadBalanceStrategy {
3    #[default]
4    RoundRobin,
5    Random,
6    Weighted(Vec<(String, u32)>),
7    Failover,
8}
9
10#[derive(Debug, Clone)]
11pub struct LoadBalancerConfig {
12    pub strategy: LoadBalanceStrategy,
13}
14
15impl LoadBalancerConfig {
16    pub fn round_robin() -> Self {
17        Self {
18            strategy: LoadBalanceStrategy::RoundRobin,
19        }
20    }
21
22    pub fn random() -> Self {
23        Self {
24            strategy: LoadBalanceStrategy::Random,
25        }
26    }
27
28    pub fn weighted(weights: Vec<(String, u32)>) -> Self {
29        Self {
30            strategy: LoadBalanceStrategy::Weighted(weights),
31        }
32    }
33
34    pub fn failover() -> Self {
35        Self {
36            strategy: LoadBalanceStrategy::Failover,
37        }
38    }
39}
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44
45    #[test]
46    fn round_robin_factory() {
47        let cfg = LoadBalancerConfig::round_robin();
48        assert_eq!(cfg.strategy, LoadBalanceStrategy::RoundRobin);
49    }
50
51    #[test]
52    fn random_factory() {
53        let cfg = LoadBalancerConfig::random();
54        assert_eq!(cfg.strategy, LoadBalanceStrategy::Random);
55    }
56
57    #[test]
58    fn weighted_factory() {
59        let weights = vec![("a".to_string(), 3), ("b".to_string(), 1)];
60        let cfg = LoadBalancerConfig::weighted(weights.clone());
61        assert_eq!(cfg.strategy, LoadBalanceStrategy::Weighted(weights));
62    }
63
64    #[test]
65    fn failover_factory() {
66        let cfg = LoadBalancerConfig::failover();
67        assert_eq!(cfg.strategy, LoadBalanceStrategy::Failover);
68    }
69
70    #[test]
71    fn default_strategy_is_round_robin() {
72        assert_eq!(
73            LoadBalanceStrategy::default(),
74            LoadBalanceStrategy::RoundRobin
75        );
76    }
77
78    #[test]
79    fn strategy_equality() {
80        assert_eq!(
81            LoadBalanceStrategy::RoundRobin,
82            LoadBalanceStrategy::RoundRobin
83        );
84        assert_ne!(LoadBalanceStrategy::RoundRobin, LoadBalanceStrategy::Random);
85    }
86
87    #[test]
88    fn clone_preserves_strategy() {
89        let cfg = LoadBalancerConfig::failover();
90        let cloned = cfg.clone();
91        assert_eq!(cloned.strategy, LoadBalanceStrategy::Failover);
92    }
93}