Skip to main content

camel_api/
load_balancer.rs

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