use std::time::Duration;
use recloser::{AsyncRecloser, Recloser};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[non_exhaustive]
pub struct HttpClientCircuitBreakerConfig {
#[serde(
default = "HttpClientCircuitBreakerConfig::default_error_rate",
alias = "threshold"
)]
pub error_rate: f32,
#[serde(
default = "HttpClientCircuitBreakerConfig::default_closed_len",
alias = "closed_length"
)]
pub closed_len: usize,
#[serde(
default = "HttpClientCircuitBreakerConfig::default_half_open_len",
alias = "half_open_length"
)]
pub half_open_len: usize,
#[serde(
default = "HttpClientCircuitBreakerConfig::default_open_wait",
alias = "open_timeout",
alias = "timeout",
with = "humantime_serde"
)]
pub open_wait: Duration,
}
impl Default for HttpClientCircuitBreakerConfig {
fn default() -> Self {
Self {
error_rate: Self::default_error_rate(),
closed_len: Self::default_closed_len(),
half_open_len: Self::default_half_open_len(),
open_wait: Self::default_open_wait(),
}
}
}
impl HttpClientCircuitBreakerConfig {
#[must_use]
#[inline]
fn default_error_rate() -> f32 {
0.5
}
#[must_use]
#[inline]
fn default_closed_len() -> usize {
100
}
#[must_use]
#[inline]
fn default_half_open_len() -> usize {
10
}
#[must_use]
#[inline]
fn default_open_wait() -> Duration {
Duration::from_secs(30)
}
#[must_use]
pub fn make_circuit_breaker(&self) -> AsyncRecloser {
AsyncRecloser::from(
Recloser::custom()
.error_rate(self.error_rate)
.closed_len(self.closed_len)
.half_open_len(self.half_open_len)
.open_wait(self.open_wait)
.build(),
)
}
}