use std::time::Duration;
use backoff::{
ExponentialBackoff, ExponentialBackoffBuilder,
default::{INITIAL_INTERVAL_MILLIS, MAX_INTERVAL_MILLIS, MULTIPLIER, RANDOMIZATION_FACTOR},
};
#[derive(Debug)]
pub struct PythLazerExponentialBackoff {
initial_interval: Duration,
randomization_factor: f64,
multiplier: f64,
max_interval: Duration,
}
impl From<PythLazerExponentialBackoff> for ExponentialBackoff {
fn from(val: PythLazerExponentialBackoff) -> Self {
ExponentialBackoffBuilder::default()
.with_initial_interval(val.initial_interval)
.with_randomization_factor(val.randomization_factor)
.with_multiplier(val.multiplier)
.with_max_interval(val.max_interval)
.with_max_elapsed_time(None)
.build()
}
}
#[derive(Debug)]
pub struct PythLazerExponentialBackoffBuilder {
initial_interval: Duration,
randomization_factor: f64,
multiplier: f64,
max_interval: Duration,
}
impl Default for PythLazerExponentialBackoffBuilder {
fn default() -> Self {
Self {
initial_interval: Duration::from_millis(INITIAL_INTERVAL_MILLIS),
randomization_factor: RANDOMIZATION_FACTOR,
multiplier: MULTIPLIER,
max_interval: Duration::from_millis(MAX_INTERVAL_MILLIS),
}
}
}
impl PythLazerExponentialBackoffBuilder {
pub fn new() -> Self {
Default::default()
}
pub fn with_initial_interval(&mut self, initial_interval: Duration) -> &mut Self {
self.initial_interval = initial_interval;
self
}
pub fn with_randomization_factor(&mut self, randomization_factor: f64) -> &mut Self {
self.randomization_factor = randomization_factor;
self
}
pub fn with_multiplier(&mut self, multiplier: f64) -> &mut Self {
self.multiplier = multiplier;
self
}
pub fn with_max_interval(&mut self, max_interval: Duration) -> &mut Self {
self.max_interval = max_interval;
self
}
pub fn build(&self) -> PythLazerExponentialBackoff {
PythLazerExponentialBackoff {
initial_interval: self.initial_interval,
randomization_factor: self.randomization_factor,
multiplier: self.multiplier,
max_interval: self.max_interval,
}
}
}