1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
use std::time::Duration;
/// `Backoff` is a backoff policy for retrying an operation.
pub trait Backoff {
/// Resets the internal state to the initial value.
fn reset(&mut self) {}
/// next_backoff() time is elapsed before it is called again.
/// If it returns None, it means the operation timed out and no
/// further retries are done.
fn next_backoff(&mut self) -> Option<Duration>;
}
impl<B: Backoff + ?Sized> Backoff for Box<B> {
fn next_backoff(&mut self) -> Option<Duration> {
let this: &mut B = self;
this.next_backoff()
}
fn reset(&mut self) {
let this: &mut B = self;
this.reset()
}
}
/// Immediately retry the operation.
#[derive(Debug)]
pub struct Zero {}
impl Backoff for Zero {
fn next_backoff(&mut self) -> Option<Duration> {
Some(Duration::default())
}
}
/// The operation should never be retried.
#[derive(Debug)]
pub struct Stop {}
impl Backoff for Stop {
fn next_backoff(&mut self) -> Option<Duration> {
None
}
}
/// Contant is a backoff policy which always returns
/// a constant duration.
#[derive(Debug)]
pub struct Constant {
interval: Duration,
}
impl Constant {
/// Creates a new Constant backoff with `interval` contant
/// backoff.
pub fn new(interval: Duration) -> Constant {
Constant { interval }
}
}
impl Backoff for Constant {
fn next_backoff(&mut self) -> Option<Duration> {
Some(self.interval)
}
}