use std::marker::PhantomData;
use serde::Serialize;
use crate::models::Job;
use crate::Result;
#[derive(Debug, Clone)]
pub struct ScriptHandle<P> {
name: &'static str,
_params: PhantomData<P>,
}
impl<P> ScriptHandle<P> {
pub const fn new(name: &'static str) -> Self {
Self {
name,
_params: PhantomData,
}
}
pub const fn name(&self) -> &'static str {
self.name
}
pub fn job(&self, job_name: impl Into<String>) -> Job {
Job::new(job_name, self.name)
}
}
impl<P: Serialize> ScriptHandle<P> {
pub fn job_with_params(&self, job_name: impl Into<String>, params: &P) -> Result<Job> {
let mut job = self.job(job_name);
job.params_json = serde_json::to_value(params).map_err(crate::ChrononError::from)?;
Ok(job)
}
}
#[cfg(test)]
mod tests {
use super::*;
use serde::Serialize;
#[derive(Serialize)]
struct DemoParams {
n: u32,
}
#[test]
fn job_sets_script_name() {
let handle = ScriptHandle::<()>::new("demo");
let job = handle.job("demo-job");
assert_eq!(job.job_name, "demo-job");
assert_eq!(job.script_name, "demo");
}
#[test]
fn job_with_params_serializes() {
let handle = ScriptHandle::<DemoParams>::new("demo");
let job = handle
.job_with_params("demo-job", &DemoParams { n: 3 })
.unwrap();
assert_eq!(job.params_json["n"], 3);
}
}