(&self)
| 87 | } |
| 88 | |
| 89 | async fn can_execute(&self) -> bool { |
| 90 | if !self.config.circuit_breaker_enabled { |
| 91 | return true; |
| 92 | } |
| 93 | |
| 94 | let mut state = self.state.write().await; |
| 95 | match *state { |
| 96 | CircuitBreakerState::Closed { .. } => true, |
| 97 | CircuitBreakerState::Open { opened_at } => { |
| 98 | if opened_at.elapsed() > self.config.circuit_breaker_recovery_timeout { |
| 99 | *state = CircuitBreakerState::HalfOpen; |
| 100 | true |
| 101 | } else { |
| 102 | false |
| 103 | } |
| 104 | } |
| 105 | CircuitBreakerState::HalfOpen => true, |
| 106 | } |
| 107 | } |
| 108 | |
| 109 | async fn record_success(&self) { |
| 110 | if !self.config.circuit_breaker_enabled { |
no outgoing calls
no test coverage detected