use serde::{Deserialize, Serialize};
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize,
)]
#[serde(rename_all = "lowercase")]
pub enum Mode {
Minimal,
#[default]
Fancy,
Panels,
}
impl Mode {
pub const ALL: [Mode; 3] = [Mode::Minimal, Mode::Fancy, Mode::Panels];
#[must_use]
pub fn next(self) -> Mode {
match self {
Mode::Minimal => Mode::Fancy,
Mode::Fancy => Mode::Panels,
Mode::Panels => Mode::Minimal,
}
}
pub fn is_fancy(self) -> bool {
matches!(self, Mode::Fancy)
}
pub fn is_panels(self) -> bool {
matches!(self, Mode::Panels)
}
pub fn label(self) -> &'static str {
match self {
Mode::Minimal => "Minimal",
Mode::Fancy => "Fancy",
Mode::Panels => "Panels",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn next_cycles_through_all_and_wraps() {
assert_eq!(Mode::Minimal.next(), Mode::Fancy);
assert_eq!(Mode::Fancy.next(), Mode::Panels);
assert_eq!(Mode::Panels.next(), Mode::Minimal);
}
#[test]
fn is_fancy_only_for_fancy() {
assert!(Mode::Fancy.is_fancy());
assert!(!Mode::Minimal.is_fancy());
assert!(!Mode::Panels.is_fancy());
}
#[test]
fn is_panels_only_for_panels() {
assert!(Mode::Panels.is_panels());
assert!(!Mode::Minimal.is_panels());
assert!(!Mode::Fancy.is_panels());
}
}