use crate::Backoff;
use time::Duration;
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct SyncPolicy {
pub interval: Duration,
pub min_interval: Duration,
pub backoff: Backoff,
pub offline_retry: Duration,
pub max_throttle: Duration,
}
impl Default for SyncPolicy {
fn default() -> Self {
Self {
interval: Duration::minutes(5),
min_interval: Duration::seconds(30),
backoff: Backoff::default(),
offline_retry: Duration::seconds(20),
max_throttle: Duration::hours(24),
}
}
}
impl SyncPolicy {
pub fn every(interval: Duration) -> Self {
Self {
interval,
min_interval: (interval / 10_i32).max(Duration::seconds(5)),
..Self::default()
}
}
pub fn with_min_interval(mut self, min_interval: Duration) -> Self {
self.min_interval = min_interval;
self
}
pub fn with_backoff(mut self, backoff: Backoff) -> Self {
self.backoff = backoff;
self
}
pub fn with_offline_retry(mut self, offline_retry: Duration) -> Self {
self.offline_retry = offline_retry;
self
}
pub fn with_max_throttle(mut self, max_throttle: Duration) -> Self {
self.max_throttle = max_throttle;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn a_fast_cadence_still_keeps_a_sane_floor() {
assert_eq!(
SyncPolicy::every(Duration::seconds(10)).min_interval,
Duration::seconds(5)
);
}
#[test]
fn a_slow_cadence_scales_its_floor() {
assert_eq!(
SyncPolicy::every(Duration::hours(1)).min_interval,
Duration::minutes(6)
);
}
}