use std::{future::Future, io, time::Duration};
mod async_job;
mod context;
mod job;
pub use async_job::{AsyncCronJob, AsyncJob, AsyncJobScheduler};
pub use context::JobContext;
pub use job::{CronJob, Job, JobScheduler};
pub trait Scheduler {
fn is_ready(&self) -> bool;
fn time_till_next_job(&self) -> Option<Duration>;
fn tick(&mut self);
}
pub trait AsyncScheduler {
fn is_ready(&self) -> bool;
fn is_blocking(&self) -> bool;
fn time_till_next_job(&self) -> Option<Duration>;
fn tick(&mut self) -> impl Future<Output = ()> + Send;
fn run(self) -> impl Future<Output = io::Result<()>> + Send;
}
#[cfg(feature = "apalis")]
impl AsyncScheduler for apalis::prelude::Monitor {
#[inline]
fn is_ready(&self) -> bool {
true
}
#[inline]
fn is_blocking(&self) -> bool {
true
}
#[inline]
fn time_till_next_job(&self) -> Option<Duration> {
None
}
#[inline]
async fn tick(&mut self) {}
#[inline]
async fn run(self) -> io::Result<()> {
self.run().await
}
}
const DEFAULT_TICK_INTERVAL: Duration = Duration::from_millis(500);