use crate::backoff::Backoff;
use std::time::Duration;
pub(crate) fn should_retry_after<E, P, B>(
err: &E,
when: &P,
backoff: &mut B,
max_elapsed: Option<Duration>,
elapsed: impl FnOnce() -> Duration,
) -> Option<Duration>
where
P: Fn(&E) -> bool,
B: Backoff,
{
if !when(err) {
return None; }
let delay = backoff.next_delay()?; if let Some(budget) = max_elapsed {
if elapsed().saturating_add(delay) >= budget {
return None; }
}
Some(delay)
}
pub(crate) fn trace_retry<E: std::fmt::Debug>(attempt: u32, error: &E, delay: Duration) {
tracing::warn!(
target: "mettle::retry",
attempt,
delay_ms = delay.as_millis() as u64,
error = ?error,
"retrying after error"
);
}