Skip to main content

tulpje_framework/handler/
task_handler.rs

1use std::{future::Future, pin::Pin};
2
3use async_cron_scheduler::cron::Schedule;
4use chrono::{DateTime, Utc};
5
6use crate::Error;
7use crate::context::TaskContext;
8
9pub(crate) type TaskFunc<T> =
10    fn(TaskContext<T>) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send>>;
11
12#[derive(Clone)]
13pub struct TaskHandler<T: Clone + Send + Sync> {
14    pub module: String,
15    pub name: String,
16    pub cron: Schedule,
17    pub func: TaskFunc<T>,
18}
19
20impl<T: Clone + Send + Sync> TaskHandler<T> {
21    #[tracing::instrument(name="task-handler", skip_all, fields(
22        module=self.module,
23        name=self.name
24    ))]
25    pub async fn run(&self, ctx: TaskContext<T>) -> Result<(), Error> {
26        // can add more handling/parsing/etc here in the future
27        (self.func)(ctx).await
28    }
29
30    pub fn next_run(&self) -> Option<DateTime<Utc>> {
31        self.cron.upcoming(Utc).next()
32    }
33}