rs-zero 0.1.1

Rust-first microservice framework inspired by go-zero engineering practices
Documentation
use std::time::Duration;

use crate::discovery::ServiceInstance;

/// Watch event kind.
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum WatchEventKind {
    /// Instance created or updated.
    Put,
    /// Instance deleted.
    Delete,
}

/// Normalized etcd watch event.
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct WatchEvent {
    /// Event kind.
    pub kind: WatchEventKind,
    /// Service instance.
    pub instance: ServiceInstance,
}

/// Reconnect backoff configuration.
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BackoffConfig {
    /// Initial delay.
    pub initial: Duration,
    /// Maximum delay.
    pub max: Duration,
}

impl Default for BackoffConfig {
    fn default() -> Self {
        Self {
            initial: Duration::from_millis(200),
            max: Duration::from_secs(5),
        }
    }
}

impl BackoffConfig {
    /// Returns the delay for an attempt number.
    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);
    }
}