use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum ItemStatus {
#[default]
InProgress,
Incomplete,
Completed,
Failed,
}
impl ItemStatus {
#[inline]
pub fn is_terminal(&self) -> bool {
matches!(self, Self::Incomplete | Self::Completed | Self::Failed)
}
#[inline]
pub fn is_success(&self) -> bool {
matches!(self, Self::Completed)
}
#[inline]
pub fn is_failure(&self) -> bool {
matches!(self, Self::Failed | Self::Incomplete)
}
}
impl std::fmt::Display for ItemStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::InProgress => write!(f, "in_progress"),
Self::Incomplete => write!(f, "incomplete"),
Self::Completed => write!(f, "completed"),
Self::Failed => write!(f, "failed"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_terminal_states() {
assert!(!ItemStatus::InProgress.is_terminal());
assert!(ItemStatus::Incomplete.is_terminal());
assert!(ItemStatus::Completed.is_terminal());
assert!(ItemStatus::Failed.is_terminal());
}
#[test]
fn test_success_failure() {
assert!(!ItemStatus::InProgress.is_success());
assert!(ItemStatus::Completed.is_success());
assert!(!ItemStatus::Failed.is_success());
assert!(!ItemStatus::InProgress.is_failure());
assert!(!ItemStatus::Completed.is_failure());
assert!(ItemStatus::Failed.is_failure());
assert!(ItemStatus::Incomplete.is_failure());
}
#[test]
fn test_serialization() {
assert_eq!(
serde_json::to_string(&ItemStatus::InProgress).unwrap(),
"\"in_progress\""
);
assert_eq!(
serde_json::to_string(&ItemStatus::Completed).unwrap(),
"\"completed\""
);
}
}