#[derive(Clone, Copy, PartialEq, Eq, Debug, Default, Hash)]
#[repr(u16)]
pub enum PiniMode {
#[default]
No = 0,
Yes = 1,
Run = 2,
Running = 3,
Pause = 4,
Paused = 5,
}
impl PiniMode {
pub fn from_u16(v: u16) -> Self {
match v {
1 => Self::Yes,
2 => Self::Run,
3 => Self::Running,
4 => Self::Pause,
5 => Self::Paused,
_ => Self::No,
}
}
pub fn to_u16(self) -> u16 {
self as u16
}
}
impl std::fmt::Display for PiniMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(super::menu_choices::MENU_PINI[*self as usize])
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn menu_indices_match_the_dbd_value_order() {
assert_eq!(PiniMode::No.to_u16(), 0);
assert_eq!(PiniMode::Yes.to_u16(), 1);
assert_eq!(PiniMode::Run.to_u16(), 2);
assert_eq!(PiniMode::Running.to_u16(), 3);
assert_eq!(PiniMode::Pause.to_u16(), 4);
assert_eq!(PiniMode::Paused.to_u16(), 5);
for v in 0u16..=5 {
assert_eq!(PiniMode::from_u16(v).to_u16(), v);
}
}
#[test]
fn labels_match_the_shared_menu_table() {
for (i, label) in super::super::menu_choices::MENU_PINI.iter().enumerate() {
assert_eq!(PiniMode::from_u16(i as u16).to_string(), *label);
}
assert_eq!(PiniMode::Run.to_string(), "RUN");
assert_eq!(PiniMode::default(), PiniMode::No);
}
}