use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
pub enum KillSwitchMode {
#[default]
Off,
Auto,
AlwaysOn,
}
impl KillSwitchMode {
#[must_use]
pub fn next(self) -> Self {
match self {
Self::Off => Self::Auto,
Self::Auto => Self::AlwaysOn,
Self::AlwaysOn => Self::Off,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
pub enum KillSwitchState {
#[default]
Disabled,
Armed,
Blocking,
}
impl KillSwitchState {
#[must_use]
pub const fn is_blocking(self) -> bool {
matches!(self, Self::Blocking)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_mode_cycle() {
assert_eq!(KillSwitchMode::Off.next(), KillSwitchMode::Auto);
assert_eq!(KillSwitchMode::Auto.next(), KillSwitchMode::AlwaysOn);
assert_eq!(KillSwitchMode::AlwaysOn.next(), KillSwitchMode::Off);
}
#[test]
fn test_state_is_blocking() {
assert!(!KillSwitchState::Disabled.is_blocking());
assert!(!KillSwitchState::Armed.is_blocking());
assert!(KillSwitchState::Blocking.is_blocking());
}
}