use std::fmt::Display;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum OperationalMode {
#[default]
Unspecified,
Inactive,
TelemetryOnly,
ControlOnly,
ControlAndTelemetry,
}
impl OperationalMode {
pub fn provides_telemetry(self) -> bool {
match self {
OperationalMode::Unspecified
| OperationalMode::TelemetryOnly
| OperationalMode::ControlAndTelemetry => true,
OperationalMode::Inactive | OperationalMode::ControlOnly => false,
}
}
}
impl Display for OperationalMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
OperationalMode::Unspecified => write!(f, "Unspecified"),
OperationalMode::Inactive => write!(f, "Inactive"),
OperationalMode::TelemetryOnly => write!(f, "TelemetryOnly"),
OperationalMode::ControlOnly => write!(f, "ControlOnly"),
OperationalMode::ControlAndTelemetry => write!(f, "ControlAndTelemetry"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_provides_telemetry() {
for mode in [
OperationalMode::Unspecified,
OperationalMode::TelemetryOnly,
OperationalMode::ControlAndTelemetry,
] {
assert!(mode.provides_telemetry(), "{mode} should provide telemetry");
}
for mode in [OperationalMode::Inactive, OperationalMode::ControlOnly] {
assert!(
!mode.provides_telemetry(),
"{mode} should not provide telemetry"
);
}
}
#[test]
fn test_default_is_unspecified() {
assert_eq!(OperationalMode::default(), OperationalMode::Unspecified);
}
}