use std::fmt::Debug;
use std::time::Duration;
use crate::breaker::{ExecutionResult, HealthInfo, HealthMetricsBuilder};
pub(super) mod probing;
#[cfg(any(feature = "metrics", feature = "logs", test))]
#[derive(Debug, Copy, Clone)]
pub(crate) enum CircuitState {
Closed,
Open,
HalfOpen,
}
#[cfg(any(feature = "metrics", feature = "logs", test))]
impl CircuitState {
pub fn as_str(self) -> &'static str {
match self {
Self::Closed => "closed",
Self::Open => "open",
Self::HalfOpen => "half_open",
}
}
}
#[derive(Debug, Clone)]
pub(crate) enum EnterCircuitResult {
Accepted { mode: ExecutionMode },
Rejected,
}
#[derive(Debug, Clone)]
pub(crate) enum ExitCircuitResult {
Unchanged,
Opened(HealthInfo),
Reopened,
Closed(Stats),
}
#[derive(Debug, Clone)]
pub(crate) struct EngineOptions {
pub break_duration: Duration,
pub health_metrics_builder: HealthMetricsBuilder,
pub probes: probing::ProbesOptions,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub(crate) enum ExecutionMode {
Normal,
Probe,
}
pub type Engine = EngineTelemetry<EngineCore>;
pub(crate) trait CircuitEngine: Debug + Send + Sync + 'static {
fn enter(&self) -> EnterCircuitResult;
fn exit(&self, result: ExecutionResult, mode: ExecutionMode) -> ExitCircuitResult;
}
mod engine_core;
pub(crate) use engine_core::*;
#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod engine_fake;
#[cfg(test)]
pub(crate) use engine_fake::*;
mod engine_telemetry;
pub(crate) use engine_telemetry::*;
mod engines;
pub(crate) use engines::*;
#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_circuit_state_as_str() {
assert_eq!(CircuitState::Closed.as_str(), "closed");
assert_eq!(CircuitState::Open.as_str(), "open");
assert_eq!(CircuitState::HalfOpen.as_str(), "half_open");
}
}