use std::sync::atomic::{AtomicU64, Ordering};
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct JobId(String);
impl JobId {
pub fn from_string(s: impl Into<String>) -> Self {
Self(s.into())
}
pub fn as_str(&self) -> &str {
&self.0
}
}
impl std::fmt::Display for JobId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
static JOB_COUNTER: AtomicU64 = AtomicU64::new(0);
pub fn create_job_id() -> JobId {
let now = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap_or_default()
.as_nanos();
let c = JOB_COUNTER.fetch_add(1, Ordering::Relaxed);
JobId::from_string(format!("job-{}-{}", now, c))
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum JobPhase {
Queued,
Sending,
Sent,
Printing,
Completed,
Failed,
Aborted,
}
impl JobPhase {
pub fn is_terminal(&self) -> bool {
matches!(
self,
JobPhase::Completed | JobPhase::Failed | JobPhase::Aborted
)
}
}