#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Harness {
Dominic,
Wallace,
Sakamoto,
Tsume,
Pi,
Opencode,
Proserpina,
Other,
}
impl Harness {
pub fn as_wire_str(&self) -> &'static str {
match self {
Harness::Dominic => "dominic",
Harness::Wallace => "wallace",
Harness::Sakamoto => "sakamoto",
Harness::Tsume => "tsume",
Harness::Pi => "pi",
Harness::Opencode => "opencode",
Harness::Proserpina => "proserpina",
Harness::Other => "other",
}
}
pub fn from_wire_str(s: &str) -> Self {
match s {
"dominic" => Harness::Dominic,
"wallace" => Harness::Wallace,
"sakamoto" => Harness::Sakamoto,
"tsume" => Harness::Tsume,
"pi" => Harness::Pi,
"opencode" => Harness::Opencode,
"proserpina" => Harness::Proserpina,
_ => Harness::Other,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn wire_strings_are_stable_and_lowercase() {
assert_eq!(Harness::Pi.as_wire_str(), "pi");
assert_eq!(Harness::Tsume.as_wire_str(), "tsume");
for h in [
Harness::Dominic,
Harness::Wallace,
Harness::Sakamoto,
Harness::Tsume,
Harness::Pi,
Harness::Opencode,
Harness::Proserpina,
Harness::Other,
] {
let s = h.as_wire_str();
assert!(
s == s.to_ascii_lowercase(),
"wire string for {h:?} must be lowercase"
);
}
}
#[test]
fn from_wire_str_round_trips_known_harnesses() {
for h in [
Harness::Dominic,
Harness::Wallace,
Harness::Sakamoto,
Harness::Tsume,
Harness::Pi,
Harness::Opencode,
Harness::Proserpina,
] {
assert_eq!(Harness::from_wire_str(h.as_wire_str()), h);
}
assert_eq!(Harness::from_wire_str("future-harness"), Harness::Other);
}
}