use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum HpcJobStatus {
Unknown,
None,
Queued,
Running,
Complete,
}
impl std::fmt::Display for HpcJobStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
HpcJobStatus::Unknown => write!(f, "unknown"),
HpcJobStatus::None => write!(f, "none"),
HpcJobStatus::Queued => write!(f, "queued"),
HpcJobStatus::Running => write!(f, "running"),
HpcJobStatus::Complete => write!(f, "complete"),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct HpcJobInfo {
pub job_id: String,
pub name: String,
pub status: HpcJobStatus,
}
impl HpcJobInfo {
pub fn new(job_id: String, name: String, status: HpcJobStatus) -> Self {
Self {
job_id,
name,
status,
}
}
pub fn none() -> Self {
Self {
job_id: String::new(),
name: String::new(),
status: HpcJobStatus::None,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct HpcJobStats {
pub hpc_job_id: String,
pub name: String,
pub start: DateTime<Utc>,
pub end: Option<DateTime<Utc>>,
pub state: String,
pub account: String,
pub partition: String,
pub qos: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum HpcType {
Pbs,
Slurm,
Fake,
}
impl std::fmt::Display for HpcType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
HpcType::Pbs => write!(f, "pbs"),
HpcType::Slurm => write!(f, "slurm"),
HpcType::Fake => write!(f, "fake"),
}
}
}
impl std::str::FromStr for HpcType {
type Err = anyhow::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
"pbs" => Ok(HpcType::Pbs),
"slurm" => Ok(HpcType::Slurm),
"fake" => Ok(HpcType::Fake),
_ => Err(anyhow::anyhow!("Unknown HPC type: {}", s)),
}
}
}