use std::time::Duration;
use crate::{Error, DEFAULT_MAX_DELAY, DEFAULT_MIN_DELAY};
pub type RetryHandler = Box<dyn FnMut(&mut RetryHandle) + Send>;
pub struct RetryHandle {
pub(crate) total_tries: u64,
pub(crate) retries: u64,
pub(crate) delay: std::time::Duration,
pub(crate) error: crate::Error,
pub(crate) cancelled: bool,
}
impl RetryHandle {
pub fn new(
total_tries: u64,
retries: u64,
delay: std::time::Duration,
error: crate::Error,
) -> Self {
Self {
total_tries,
retries,
delay,
error,
cancelled: false,
}
}
pub fn total_tries(&self) -> u64 {
self.total_tries
}
pub fn retries(&self) -> u64 {
self.retries
}
pub fn delay(&self) -> std::time::Duration {
self.delay
}
pub fn set_delay(&mut self, delay: std::time::Duration) {
self.delay = delay;
}
pub fn error(&self) -> &crate::Error {
&self.error
}
pub fn cancel(&mut self) {
self.cancelled = true;
}
}
pub fn default_retry_callback(handle: &mut RetryHandle) {
if matches!(handle.error(), Error::FileChanged { .. }) {
handle.set_delay(Duration::ZERO);
} else {
handle.set_delay(crate::exponential_backoff(
DEFAULT_MIN_DELAY,
DEFAULT_MAX_DELAY,
handle.retries(),
));
}
}