camel_api/
load_balancer.rs1#[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}