use std::borrow::Cow;
use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use super::{task, Status};
pub struct Create<'a> {
pub tasks: HashMap<String, task::Task<'a>>,
pub tag: Option<Cow<'a, str>>,
pub webhook_url: Option<Cow<'a, str>>,
}
#[doc(hidden)]
#[derive(Serialize)]
pub struct CreateJobRequest<'a> {
tasks: HashMap<String, serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
tag: Option<Cow<'a, str>>,
#[serde(skip_serializing_if = "Option::is_none")]
webhook_url: Option<Cow<'a, str>>,
}
impl<'a> From<Create<'a>> for CreateJobRequest<'a> {
fn from(call: Create<'a>) -> CreateJobRequest<'a> {
CreateJobRequest {
tasks: HashMap::from_iter(
call.tasks
.into_iter()
.map(|(key, value)| (key, value.to_job_task().unwrap())),
),
tag: call.tag,
webhook_url: call.webhook_url,
}
}
}
#[doc(hidden)]
#[derive(Deserialize)]
pub struct JobsOutput {
pub data: Job,
}
impl From<JobsOutput> for Job {
fn from(output: JobsOutput) -> Job {
let mut job = output.data;
for task in job.tasks.iter_mut() {
if let Some(task_job_id) = task.job_id.as_deref() {
assert_eq!(task_job_id, job.id);
} else {
task.job_id = Some(job.id.to_string());
}
}
job
}
}
#[derive(Debug, Deserialize)]
pub struct Job {
pub id: String,
#[serde(default)]
pub tag: Option<String>,
#[serde(default)]
pub status: Option<Status>,
#[serde(default)]
pub tasks: Vec<task::Status>,
#[serde(default)]
pub links: Option<HashMap<String, String>>,
}
impl Job {
pub fn get_task_by_name<'a>(&'a self, name: &str) -> Option<&'a task::Status> {
self.tasks
.iter()
.find(|task| matches!(&task.name, Some(task_name) if task_name == name))
}
}