modbus_relay/connection/
backoff_strategy.rs1use std::time::{Duration, Instant};
2
3use crate::config::BackoffConfig;
4
5pub 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}