modbus_relay/connection/
backoff_strategy.rs

1use std::time::{Duration, Instant};
2
3use crate::config::BackoffConfig;
4
5/// Helper for implementing backoff strategy
6pub struct BackoffStrategy {
7    config: BackoffConfig,
8    current_attempt: usize,
9    last_attempt: Option<Instant>,
10}
11
12impl BackoffStrategy {
13    pub fn new(config: BackoffConfig) -> Self {
14        Self {
15            config,
16            current_attempt: 0,
17            last_attempt: None,
18        }
19    }
20
21    pub fn next_backoff(&mut self) -> Option<Duration> {
22        if self.current_attempt >= self.config.max_retries as usize {
23            return None;
24        }
25
26        let interval = self.config.initial_interval.as_secs_f64()
27            * self.config.multiplier.powi(self.current_attempt as i32);
28
29        let interval =
30            Duration::from_secs_f64(interval.min(self.config.max_interval.as_secs_f64()));
31
32        self.current_attempt += 1;
33        self.last_attempt = Some(Instant::now());
34        Some(interval)
35    }
36
37    pub fn reset(&mut self) {
38        self.current_attempt = 0;
39        self.last_attempt = None;
40    }
41}