use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
#[non_exhaustive]
pub enum RunnerKind {
Primary,
Named { name: String },
Temp { id: String },
External,
}
impl RunnerKind {
pub fn from_id(id: &str) -> Self {
if id == "primary" {
Self::Primary
} else if id.starts_with("test-") {
Self::Temp { id: id.to_string() }
} else if id.starts_with("named-") {
Self::Named {
name: id.to_string(),
}
} else {
Self::External
}
}
pub fn is_primary(&self) -> bool {
matches!(self, Self::Primary)
}
pub fn is_temp(&self) -> bool {
matches!(self, Self::Temp { .. })
}
pub fn is_named(&self) -> bool {
matches!(self, Self::Named { .. })
}
pub fn is_external(&self) -> bool {
matches!(self, Self::External)
}
pub fn is_secondary(&self) -> bool {
!self.is_primary()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn from_id_primary() {
assert_eq!(RunnerKind::from_id("primary"), RunnerKind::Primary);
}
#[test]
fn from_id_temp() {
assert_eq!(
RunnerKind::from_id("test-abc"),
RunnerKind::Temp {
id: "test-abc".to_string()
}
);
}
#[test]
fn from_id_named() {
assert_eq!(
RunnerKind::from_id("named-9880-deadbeef"),
RunnerKind::Named {
name: "named-9880-deadbeef".to_string()
}
);
}
#[test]
fn from_id_external() {
assert_eq!(RunnerKind::from_id("randomthing"), RunnerKind::External);
}
#[test]
fn predicates_classify_correctly() {
assert!(RunnerKind::Primary.is_primary());
assert!(!RunnerKind::Primary.is_secondary());
let temp = RunnerKind::Temp {
id: "test-x".to_string(),
};
assert!(temp.is_temp());
assert!(temp.is_secondary());
let named = RunnerKind::Named {
name: "foo".to_string(),
};
assert!(named.is_named());
assert!(named.is_secondary());
assert!(RunnerKind::External.is_external());
assert!(RunnerKind::External.is_secondary());
}
}