#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum ReaperMode {
On,
Sweep,
Off,
}
impl ReaperMode {
pub(crate) fn from_env() -> Self {
Self::parse(std::env::var("RIGHTSIZE_REAPER").ok().as_deref())
}
pub(crate) fn parse(value: Option<&str>) -> Self {
match value {
Some(v) if v.eq_ignore_ascii_case("off") => ReaperMode::Off,
Some(v) if v.eq_ignore_ascii_case("sweep") => ReaperMode::Sweep,
_ => ReaperMode::On,
}
}
pub(crate) fn ledger_enabled(self) -> bool {
self != ReaperMode::Off
}
pub(crate) fn sweep_enabled(self) -> bool {
self != ReaperMode::Off
}
pub(crate) fn watchdog_enabled(self) -> bool {
self == ReaperMode::On
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn unset_defaults_to_on() {
assert_eq!(ReaperMode::parse(None), ReaperMode::On);
}
#[test]
fn recognizes_sweep_and_off_case_insensitively() {
assert_eq!(ReaperMode::parse(Some("sweep")), ReaperMode::Sweep);
assert_eq!(ReaperMode::parse(Some("SWEEP")), ReaperMode::Sweep);
assert_eq!(ReaperMode::parse(Some("off")), ReaperMode::Off);
assert_eq!(ReaperMode::parse(Some("OFF")), ReaperMode::Off);
}
#[test]
fn unknown_values_fall_back_to_on() {
assert_eq!(ReaperMode::parse(Some("banana")), ReaperMode::On);
assert_eq!(ReaperMode::parse(Some("")), ReaperMode::On);
}
#[test]
fn explicit_on_is_on() {
assert_eq!(ReaperMode::parse(Some("on")), ReaperMode::On);
}
#[test]
fn on_enables_the_ledger_the_sweep_and_the_watchdog() {
assert!(ReaperMode::On.ledger_enabled());
assert!(ReaperMode::On.sweep_enabled());
assert!(ReaperMode::On.watchdog_enabled());
}
#[test]
fn sweep_mode_enables_the_ledger_and_the_sweep_but_not_the_watchdog() {
assert!(ReaperMode::Sweep.ledger_enabled());
assert!(ReaperMode::Sweep.sweep_enabled());
assert!(!ReaperMode::Sweep.watchdog_enabled());
}
#[test]
fn off_disables_everything() {
assert!(!ReaperMode::Off.ledger_enabled());
assert!(!ReaperMode::Off.sweep_enabled());
assert!(!ReaperMode::Off.watchdog_enabled());
}
}