use super::utils;
use crate::proto::single::JobId;
use chrono::{DateTime, Utc};
use derive_builder::Builder;
#[derive(Debug, Clone, Serialize, Builder)]
#[builder(
custom_constructor,
setter(into),
build_fn(name = "try_build", private)
)]
pub struct ProgressUpdate {
#[builder(setter(custom))]
pub jid: JobId,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default = "None")]
pub percent: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default = "None")]
pub desc: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default = "None")]
pub reserve_until: Option<DateTime<Utc>>,
}
impl AsRef<Self> for ProgressUpdate {
fn as_ref(&self) -> &Self {
self
}
}
impl ProgressUpdate {
pub fn set(jid: JobId, percent: u8) -> ProgressUpdate {
ProgressUpdate::builder(jid).percent(percent).build()
}
pub fn builder(jid: JobId) -> ProgressUpdateBuilder {
ProgressUpdateBuilder::new(jid)
}
}
impl ProgressUpdateBuilder {
pub fn build(&self) -> ProgressUpdate {
self.try_build()
.expect("Only jid is required, and it is set by all constructors.")
}
pub fn new(jid: JobId) -> ProgressUpdateBuilder {
ProgressUpdateBuilder {
jid: Some(jid),
..ProgressUpdateBuilder::create_empty()
}
}
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum JobState {
Unknown,
Enqueued,
Working,
Success,
Failed,
Dead,
}
impl std::fmt::Display for JobState {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
use JobState::*;
let s = match self {
Unknown => "unknown",
Enqueued => "enqueued",
Working => "working",
Success => "success",
Failed => "failed",
Dead => "dead",
};
write!(f, "{}", s)
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct Progress {
pub jid: JobId,
pub state: JobState,
#[serde(deserialize_with = "utils::parse_datetime")]
pub updated_at: Option<DateTime<Utc>>,
pub percent: Option<u8>,
pub desc: Option<String>,
}
impl Progress {
pub fn update_percent(&self, percent: u8) -> ProgressUpdate {
ProgressUpdate::builder(self.jid.clone())
.desc(self.desc.clone())
.percent(percent)
.build()
}
pub fn update_builder(&self) -> ProgressUpdateBuilder {
ProgressUpdateBuilder::new(self.jid.clone())
}
}