#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
#[non_exhaustive]
pub enum RunMode {
#[default]
Normal,
Skip,
ForcePass,
ForceFail,
}
impl RunMode {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Normal => "Normal",
Self::Skip => "Skip",
Self::ForcePass => "Pass",
Self::ForceFail => "Fail",
}
}
#[must_use]
pub fn from_value(value: &str) -> Option<Self> {
[Self::Normal, Self::Skip, Self::ForcePass, Self::ForceFail]
.into_iter()
.find(|candidate| candidate.as_str() == value)
}
}
impl std::fmt::Display for RunMode {
fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
formatter.write_str(self.as_str())
}
}
#[cfg(test)]
mod tests {
use super::RunMode;
#[test]
fn the_forcing_modes_do_not_spell_themselves_the_way_they_are_named() {
assert_eq!(RunMode::ForcePass.as_str(), "Pass");
assert_eq!(RunMode::ForceFail.as_str(), "Fail");
}
#[test]
fn every_mode_round_trips() {
for mode in [
RunMode::Normal,
RunMode::Skip,
RunMode::ForcePass,
RunMode::ForceFail,
] {
assert_eq!(RunMode::from_value(mode.as_str()), Some(mode));
}
}
#[test]
fn a_step_runs_unless_told_otherwise() {
assert_eq!(RunMode::default(), RunMode::Normal);
}
#[test]
fn an_unrecognised_mode_is_reported_rather_than_guessed() {
assert_eq!(RunMode::from_value("0"), None);
assert_eq!(RunMode::from_value("normal"), None);
}
}