use std::time::Duration;
pub trait RetryStrategy: Send {
fn reset(&mut self);
fn after_failed_connect(&mut self) -> Duration;
fn after_disconnect(&mut self) -> Duration;
}
pub fn default_retry_strategy() -> Box<dyn RetryStrategy> {
doubling_retry_strategy(Duration::from_millis(1000), Duration::from_secs(60000))
}
pub fn doubling_retry_strategy(min: Duration, max: Duration) -> Box<dyn RetryStrategy> {
Doubling::create(min, max)
}
struct Doubling {
min: Duration,
max: Duration,
current: Duration,
}
impl Doubling {
pub(crate) fn create(min: Duration, max: Duration) -> Box<dyn RetryStrategy> {
Box::new(Doubling {
min,
max,
current: min,
})
}
}
impl RetryStrategy for Doubling {
fn reset(&mut self) {
self.current = self.min;
}
fn after_failed_connect(&mut self) -> Duration {
let ret = self.current;
self.current = std::cmp::min(2 * self.current, self.max);
ret
}
fn after_disconnect(&mut self) -> Duration {
self.min
}
}