use std::time::Duration;
use futures_util::future::BoxFuture;
use log::debug;
use tokio::time::{Interval, MissedTickBehavior};
use crate::Href;
pub trait StorageMonitor: Send {
fn next_event(&mut self) -> BoxFuture<'_, Event>;
}
#[derive(Debug, PartialEq)]
pub enum Event {
General,
Specific(SpecificEvent),
}
#[derive(Debug, PartialEq)]
pub struct SpecificEvent {
pub href: Href,
pub kind: EventKind,
}
#[derive(Debug, PartialEq)]
pub enum EventKind {
Change,
Delete,
}
pub struct IntervalMonitor {
timer: Interval,
}
impl IntervalMonitor {
#[must_use]
pub fn new(interval: Duration) -> IntervalMonitor {
let mut timer = tokio::time::interval(interval);
timer.set_missed_tick_behavior(MissedTickBehavior::Delay);
IntervalMonitor { timer }
}
}
impl StorageMonitor for IntervalMonitor {
fn next_event(&mut self) -> BoxFuture<'_, Event> {
Box::pin(async {
self.timer.tick().await;
debug!("Interval timer ticked");
Event::General
})
}
}