use super::Stop;
use crate::compat::Duration;
use crate::state::RetryState;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct StopAfterAttempts {
max: u32,
}
#[must_use]
pub fn attempts(max: u32) -> StopAfterAttempts {
assert!(max >= 1, "stop::attempts requires max >= 1");
StopAfterAttempts { max }
}
impl Stop for StopAfterAttempts {
fn should_stop(&self, state: &RetryState) -> bool {
state.attempt >= self.max
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct StopAfterElapsed {
deadline: Duration,
}
#[must_use]
pub fn elapsed(deadline: Duration) -> StopAfterElapsed {
StopAfterElapsed { deadline }
}
impl Stop for StopAfterElapsed {
fn should_stop(&self, state: &RetryState) -> bool {
state
.elapsed
.is_some_and(|elapsed| elapsed >= self.deadline)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct StopNever;
#[must_use]
pub fn never() -> StopNever {
StopNever
}
impl Stop for StopNever {
fn should_stop(&self, _state: &RetryState) -> bool {
false
}
}