#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Theme {
#[default]
Dark,
Light,
}
impl Theme {
pub fn parse(s: &str) -> Self {
match s.to_ascii_lowercase().as_str() {
"light" => Theme::Light,
_ => Theme::Dark,
}
}
pub fn toggled(self) -> Self {
match self {
Theme::Dark => Theme::Light,
Theme::Light => Theme::Dark,
}
}
pub fn label(self) -> &'static str {
match self {
Theme::Dark => "dark",
Theme::Light => "light",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parse_known_and_unknown() {
assert_eq!(Theme::parse("light"), Theme::Light);
assert_eq!(Theme::parse("LIGHT"), Theme::Light);
assert_eq!(Theme::parse("dark"), Theme::Dark);
assert_eq!(Theme::parse("bogus"), Theme::Dark);
assert_eq!(Theme::parse(""), Theme::Dark);
}
#[test]
fn toggle_round_trips() {
assert_eq!(Theme::Dark.toggled(), Theme::Light);
assert_eq!(Theme::Light.toggled(), Theme::Dark);
assert_eq!(Theme::Dark.toggled().toggled(), Theme::Dark);
}
#[test]
fn default_is_dark() {
assert_eq!(Theme::default(), Theme::Dark);
}
}