ch-rds 0.2.1

Runtime resource loading and local service orchestration
Documentation
use std::future::Future;
use std::time::Duration;

use self::runner::spawn_interval_task;
use tokio::task::JoinHandle;

mod runner;

#[cfg(test)]
mod tests;

/// Coordinates background cronjobs that run on a fixed interval.
#[derive(Debug, Default)]
pub struct CronjobManager {
    jobs: Vec<JoinHandle<()>>,
}

impl CronjobManager {
    /// Creates an empty cronjob manager.
    pub fn new() -> Self {
        Self { jobs: Vec::new() }
    }

    /// Spawns a cronjob that runs on the provided interval.
    pub fn spawn_interval<F, Fut>(&mut self, interval: Duration, run_on_start: bool, task: F)
    where
        F: Fn() -> Fut + Send + Sync + 'static,
        Fut: Future<Output = ()> + Send + 'static,
    {
        self.jobs
            .push(spawn_interval_task(interval, run_on_start, task));
    }
}

impl Drop for CronjobManager {
    fn drop(&mut self) {
        for job in &self.jobs {
            job.abort();
        }
    }
}