use crate::error::ForgeError;
use crate::recovery::{CircuitBreaker, RetryPolicy};
pub trait ForgeErrorRecovery: ForgeError {
fn create_retry_policy(&self, max_retries: usize) -> RetryPolicy {
RetryPolicy::new_exponential().with_max_retries(max_retries)
}
fn retry<F, T, E>(&self, max_retries: usize, operation: F) -> Result<T, E>
where
F: FnMut() -> Result<T, E>,
E: ForgeError,
{
let policy = self.create_retry_policy(max_retries);
policy.forge_executor().retry(operation)
}
fn create_circuit_breaker(&self, name: impl Into<String>) -> CircuitBreaker {
CircuitBreaker::new(name)
}
}
impl<T: ForgeError> ForgeErrorRecovery for T {}