use chrono::NaiveDateTime;
use serde_derive::{Deserialize, Serialize};
use super::cargo::RegistryUser;
use super::worker::WorkerSelector;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DocGenJobSpec {
pub package: String,
pub version: String,
pub target: String,
pub use_native: bool,
pub capabilities: Vec<String>,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum DocGenJobState {
Queued,
Working,
Success,
Failure,
}
impl DocGenJobState {
#[must_use]
pub fn is_final(self) -> bool {
matches!(self, Self::Success | Self::Failure)
}
#[must_use]
pub fn value(self) -> i64 {
match self {
Self::Queued => 0,
Self::Working => 1,
Self::Success => 2,
Self::Failure => 3,
}
}
}
impl From<i64> for DocGenJobState {
fn from(value: i64) -> Self {
match value {
1 => Self::Working,
2 => Self::Success,
3 => Self::Failure,
_ => Self::Queued,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DocGenTrigger {
Upload { by: RegistryUser },
NewTarget { by: RegistryUser },
Manual { by: RegistryUser },
MissingOnLaunch,
}
impl DocGenTrigger {
#[must_use]
pub fn value(&self) -> i64 {
match self {
Self::Upload { by: _ } => 0,
Self::NewTarget { by: _ } => 1,
Self::Manual { by: _ } => 2,
Self::MissingOnLaunch => 3,
}
}
#[must_use]
pub fn by(&self) -> Option<&RegistryUser> {
match self {
Self::Upload { by } | Self::NewTarget { by } | Self::Manual { by } => Some(by),
Self::MissingOnLaunch => None,
}
}
}
impl From<(i64, Option<RegistryUser>)> for DocGenTrigger {
fn from(spec: (i64, Option<RegistryUser>)) -> Self {
match spec {
(0, Some(by)) => Self::Upload { by },
(1, Some(by)) => Self::NewTarget { by },
(2, Some(by)) => Self::Manual { by },
_ => Self::MissingOnLaunch,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DocGenJob {
pub id: i64,
pub package: String,
pub version: String,
pub target: String,
pub use_native: bool,
pub capabilities: Vec<String>,
pub state: DocGenJobState,
#[serde(rename = "queuedOn")]
pub queued_on: NaiveDateTime,
#[serde(rename = "startedOn")]
pub started_on: NaiveDateTime,
#[serde(rename = "finishedOn")]
pub finished_on: NaiveDateTime,
#[serde(rename = "lastUpdate")]
pub last_update: NaiveDateTime,
pub trigger: DocGenTrigger,
}
impl DocGenJob {
#[must_use]
pub fn get_worker_selector(&self) -> WorkerSelector {
let mut selector = if self.use_native {
WorkerSelector::new_native_target(self.target.clone())
} else {
WorkerSelector::new_available_target(self.target.clone())
};
selector.capabilities.clone_from(&self.capabilities);
selector
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DocGenJobUpdate {
#[serde(rename = "jobId")]
pub job_id: i64,
pub state: DocGenJobState,
#[serde(rename = "lastUpdate")]
pub last_update: NaiveDateTime,
pub log: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DocGenEvent {
Queued(Box<DocGenJob>),
Update(DocGenJobUpdate),
}