CommonLibrary/Transport/
CircuitBreaker.rs1#![allow(non_snake_case, non_camel_case_types, non_upper_case_globals)]
2use std::time::Duration;
8
9#[derive(Debug, Clone)]
11pub struct CircuitBreakerConfiguration {
12 pub FailureThreshold:u32,
14
15 pub ResetTimeout:Duration,
17
18 pub SuccessThreshold:u32,
20}
21
22impl Default for CircuitBreakerConfiguration {
23 fn default() -> Self { Self { FailureThreshold:5, ResetTimeout:Duration::from_secs(60), SuccessThreshold:2 } }
24}
25
26#[derive(Debug, Clone)]
31pub struct CircuitBreaker {
32 Configuration:CircuitBreakerConfiguration,
33
34 FailureCount:u32,
35
36 IsOpen:bool,
37}
38
39impl CircuitBreaker {
40 pub fn New(Configuration:CircuitBreakerConfiguration) -> Self {
42 Self { Configuration, FailureCount:0, IsOpen:false }
43 }
44
45 pub fn IsClosed(&self) -> bool { !self.IsOpen }
47
48 pub fn RecordSuccess(&mut self) {
50 self.FailureCount = 0;
51
52 self.IsOpen = false;
53 }
54
55 pub fn RecordFailure(&mut self) {
57 self.FailureCount += 1;
58
59 if self.FailureCount >= self.Configuration.FailureThreshold {
60 self.IsOpen = true;
61 }
62 }
63}