use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use time::OffsetDateTime;
use uuid::Uuid;
use crate::pretty_duration::PrettyDuration;
use super::{Entity, EntityDescriptorConst, WorkloadV2};
pub type JobId = Uuid;
#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, schemars::JsonSchema)]
pub struct JobSpecV1 {
pub cronjob_id: Option<Uuid>,
#[serde(flatten)]
pub definition: JobDefinition,
}
#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, schemars::JsonSchema)]
pub struct JobDefinition {
pub max_retries: Option<u32>,
pub timeout: Option<PrettyDuration>,
pub invoke: JobInvoke,
}
#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, schemars::JsonSchema)]
#[serde(rename_all = "snake_case")]
#[allow(clippy::large_enum_variant)]
pub enum JobInvoke {
Spawn(WorkloadV2),
Fetch(JobInvokeFetch),
}
#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, schemars::JsonSchema)]
pub struct JobInvokeFetch {
pub url: String,
pub method: Option<super::HttpMethod>,
pub headers: Option<HashMap<String, String>>,
pub success_status_codes: Option<Vec<u16>>,
}
impl EntityDescriptorConst for JobSpecV1 {
const NAMESPACE: &'static str = "wasmer.io";
const NAME: &'static str = "JobResult";
const VERSION: &'static str = "v1-alpha1";
const KIND: &'static str = "wasmer.io/CronJob.v1-alpha1";
type Spec = Self;
type State = ();
}
#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, schemars::JsonSchema)]
pub struct JobStatusV1 {
#[serde(with = "time::serde::timestamp::option")]
#[schemars(with = "Option<u64>")]
pub started_at: Option<OffsetDateTime>,
#[serde(with = "time::serde::timestamp::option")]
#[schemars(with = "Option<u64>")]
pub finished_at: Option<OffsetDateTime>,
pub success_invocation: Option<JobInvocation>,
pub failed_invocations: Vec<JobInvocation>,
}
#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, schemars::JsonSchema)]
pub struct JobInvocation {
#[serde(with = "time::serde::timestamp")]
#[schemars(with = "u64")]
pub started_at: OffsetDateTime,
#[serde(with = "time::serde::timestamp")]
#[schemars(with = "u64")]
pub finished_at: OffsetDateTime,
pub success: bool,
pub error: Option<String>,
pub output: Option<JobInvocationOutput>,
}
#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, schemars::JsonSchema)]
pub enum JobInvocationOutput {
Spawn(JobInvocationOutputSpawn),
Fetch(JobInvocationOutputFetch),
}
#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, schemars::JsonSchema)]
pub struct JobInvocationOutputSpawn {
pub instance_id: Option<Uuid>,
pub exit_code: Option<i32>,
}
#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, schemars::JsonSchema)]
pub struct JobInvocationOutputFetch {
pub status_code: Option<u16>,
pub body: Option<String>,
pub request_id: Option<Uuid>,
}
pub type Job = Entity<JobSpecV1>;