Skip to main content

error_forge/recovery/
forge_extensions.rs

1use crate::error::ForgeError;
2use crate::recovery::{CircuitBreaker, RetryPolicy};
3
4/// Extension trait that adds recovery capabilities to ForgeError types
5pub trait ForgeErrorRecovery: ForgeError {
6    /// Create a retry policy optimized for this error type
7    fn create_retry_policy(&self, max_retries: usize) -> RetryPolicy {
8        RetryPolicy::new_exponential().with_max_retries(max_retries)
9    }
10
11    /// Execute a fallible operation with retries if this error type is retryable
12    fn retry<F, T, E>(&self, max_retries: usize, operation: F) -> Result<T, E>
13    where
14        F: FnMut() -> Result<T, E>,
15        E: ForgeError,
16    {
17        let policy = self.create_retry_policy(max_retries);
18        policy.forge_executor().retry(operation)
19    }
20
21    /// Create a circuit breaker for operations that might result in this error type
22    fn create_circuit_breaker(&self, name: impl Into<String>) -> CircuitBreaker {
23        CircuitBreaker::new(name)
24    }
25}
26
27// Implement the extension trait for all ForgeError types
28impl<T: ForgeError> ForgeErrorRecovery for T {}