use std::num::{NonZeroU32, NonZeroUsize};
use super::to_nonzero_usize;
#[derive(Debug, Clone, PartialEq)]
pub struct InsertRetry {
max_retries: NonZeroU32,
retry_if_candidates_shorter_than: NonZeroU32,
saturate_on_last_attempt: bool,
}
impl InsertRetry {
pub fn new(
max_retries: NonZeroU32,
retry_if_candidates_shorter_than: NonZeroU32,
saturate_on_last_attempt: bool,
) -> Self {
Self {
max_retries,
retry_if_candidates_shorter_than,
saturate_on_last_attempt,
}
}
pub fn max_retries(&self) -> NonZeroUsize {
to_nonzero_usize!(self.max_retries)
}
pub fn retry_if_candidates_shorter_than(&self) -> NonZeroUsize {
to_nonzero_usize!(self.retry_if_candidates_shorter_than)
}
pub fn saturate_on_last_attempt(&self) -> bool {
self.saturate_on_last_attempt
}
pub fn should_saturate(&self, attempt: usize) -> bool {
self.saturate_on_last_attempt() && (attempt == (self.max_retries().get() - 1))
}
pub fn should_retry(&self, attempt: usize, num_candidates: usize) -> bool {
attempt != (self.max_retries().get() - 1)
&& num_candidates < self.retry_if_candidates_shorter_than().get()
}
}