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 pub ResetTimeout:Duration,
16 pub SuccessThreshold:u32,
18}
19
20impl Default for CircuitBreakerConfiguration {
21 fn default() -> Self { Self { FailureThreshold:5, ResetTimeout:Duration::from_secs(60), SuccessThreshold:2 } }
22}
23
24#[derive(Debug, Clone)]
29pub struct CircuitBreaker {
30 Configuration:CircuitBreakerConfiguration,
31 FailureCount:u32,
32 IsOpen:bool,
33}
34
35impl CircuitBreaker {
36 pub fn New(Configuration:CircuitBreakerConfiguration) -> Self {
38 Self { Configuration, FailureCount:0, IsOpen:false }
39 }
40
41 pub fn IsClosed(&self) -> bool { !self.IsOpen }
43
44 pub fn RecordSuccess(&mut self) {
46 self.FailureCount = 0;
47 self.IsOpen = false;
48 }
49
50 pub fn RecordFailure(&mut self) {
52 self.FailureCount += 1;
53 if self.FailureCount >= self.Configuration.FailureThreshold {
54 self.IsOpen = true;
55 }
56 }
57}