use std::time::Duration;
use crate::discovery::ServiceInstance;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum WatchEventKind {
Put,
Delete,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct WatchEvent {
pub kind: WatchEventKind,
pub instance: ServiceInstance,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BackoffConfig {
pub initial: Duration,
pub max: Duration,
}
impl Default for BackoffConfig {
fn default() -> Self {
Self {
initial: Duration::from_millis(200),
max: Duration::from_secs(5),
}
}
}
impl BackoffConfig {
pub fn delay_for_attempt(&self, attempt: u32) -> Duration {
let multiplier = 2_u32.saturating_pow(attempt.min(16));
(self.initial * multiplier).min(self.max)
}
}
#[cfg(test)]
mod tests {
use super::BackoffConfig;
#[test]
fn backoff_is_capped() {
let config = BackoffConfig::default();
assert!(config.delay_for_attempt(10) <= config.max);
}
}