pub mod statuable;
use serde::{Deserialize, Serialize};
use owo_colors::OwoColorize;
use std::fmt;
use std::process::Output;
use convert_case::{Case, Casing};
use crate::dates::Duration;
use log::warn;
#[derive(Default, Debug, Serialize, Deserialize, Clone, Eq, PartialEq)]
pub struct State {
pub duration: Option<Duration>,
pub status: Option<Status>,
}
#[derive(Default, Debug, Serialize, Deserialize, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
#[serde(rename_all = "kebab-case")]
pub enum Status {
#[default]
Started,
Succeeded,
Failed,
Running,
Aborted,
}
impl From<&String> for Status {
fn from(status: &String) -> Status {
let cased: &str = &status.to_case(Case::Snake);
match cased {
"started" => Status::Started,
"succeeded" => Status::Succeeded,
"failed" => Status::Failed,
"running" => Status::Running,
"aborted" => Status::Aborted,
_ => {
warn!("unexpected string, assuminng default state");
Status::default()
}
}
}
}
impl From<&Status> for String {
fn from(status: &Status) -> String {
match status {
Status::Started => "started".to_owned(),
Status::Succeeded => "succeeded".to_owned(),
Status::Failed => "failed".to_owned(),
Status::Running => "running".to_owned(),
Status::Aborted => "aborted".to_owned(),
}
}
}
impl From<&Output> for Status {
fn from(output: &Output) -> Status {
match output.status.success() {
true => Status::Succeeded,
false => Status::Failed,
}
}
}
impl fmt::Display for Status {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let icon = "●";
match *self {
Status::Started => write!(f, "{} Started", icon),
Status::Succeeded => write!(f, "{} {}", icon.blue(), "Succeeded".bold()),
Status::Failed => write!(f, "{} {}", icon.red(), "Failed".bold()),
Status::Running => write!(f, "{} {}", icon.green(), "Running".bold()),
Status::Aborted => write!(f, "{} {}", icon.yellow(), "Aborted".bold()),
}
}
}