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