tulpje_framework/handler/
task_handler.rs1use 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 (self.func)(ctx).await
28 }
29
30 pub fn next_run(&self) -> Option<DateTime<Utc>> {
31 self.cron.upcoming(Utc).next()
32 }
33}