use std::pin::Pin;
use std::task::Context;
use std::time::Duration;
use std::future::Future;
use tokio::time::Sleep;
use crate::handler::REQUEST_TIMEOUT;
#[derive(Debug)]
pub(crate) struct PeriodicJob {
interval: Duration,
delay: Pin<Box<Sleep>>,
}
impl PeriodicJob {
pub fn poll_ready(&mut self, cx: &mut Context<'_>) -> bool {
if !Future::poll(self.delay.as_mut(), cx).is_pending() {
self.delay
.as_mut()
.reset(tokio::time::Instant::now() + self.interval);
return true;
}
false
}
pub fn new(interval: Duration) -> Self {
Self {
delay: Box::pin(tokio::time::sleep(interval)),
interval,
}
}
}
impl Default for PeriodicJob {
fn default() -> Self {
Self::new(Duration::from_millis(REQUEST_TIMEOUT))
}
}