use crate::cron::Cron;
use crate::job::Job;
use chrono::{DateTime, Duration, Utc};
use serde::Serialize;
#[derive(Clone)]
pub struct TaskReq {
pub job_uuid: String,
pub run_at: Option<DateTime<Utc>>,
pub queue: Option<String>,
pub max_attempts: usize,
pub cron: Option<Cron>,
pub interval: Option<Duration>,
pub job: String,
}
impl TaskReq {
pub fn new<J>(job: J) -> TaskReq
where
J: Job + Serialize,
{
TaskReq {
job_uuid: J::UUID.to_string(),
run_at: None,
queue: None,
max_attempts: J::MAX_ATTEMPTS,
cron: None,
interval: None,
job: serde_json::to_string(&job).unwrap(),
}
}
pub fn run_at(self, t: DateTime<Utc>) -> TaskReq {
let mut tr = self.clone();
tr.run_at = Some(t);
tr
}
pub fn run_every(self, interval: Duration) -> TaskReq {
let mut tr = self.clone();
tr.interval = Some(interval);
tr
}
pub fn put_in(self, queue: &str) -> TaskReq {
let mut tr = self.clone();
tr.queue = Some(queue.to_string());
tr
}
pub fn schedule(self, cron: &Cron) -> TaskReq {
let mut tr = self.clone();
tr.cron = Some(cron.clone());
tr
}
}