use retroglyph_core::color::Color;
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct Meter {
ratio: f32,
}
impl Meter {
const GREEN: Color = Color::rgb(80, 200, 120);
const YELLOW: Color = Color::rgb(220, 200, 90);
const RED: Color = Color::rgb(220, 90, 90);
#[must_use]
pub const fn new(ratio: f32) -> Self {
Self { ratio }
}
#[must_use]
pub fn color(self) -> Color {
let t = self.ratio.clamp(0.0, 1.0);
if t < 0.5 {
Color::lerp(Self::GREEN, Self::YELLOW, t * 2.0)
} else {
Color::lerp(Self::YELLOW, Self::RED, (t - 0.5) * 2.0)
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn low_load_is_green() {
assert_eq!(Meter::new(0.0).color(), Meter::GREEN);
}
#[test]
fn mid_load_is_yellow() {
assert_eq!(Meter::new(0.5).color(), Meter::YELLOW);
}
#[test]
fn high_load_is_red() {
assert_eq!(Meter::new(1.0).color(), Meter::RED);
}
#[test]
fn out_of_range_ratios_are_clamped() {
assert_eq!(Meter::new(-1.0).color(), Meter::GREEN);
assert_eq!(Meter::new(2.0).color(), Meter::RED);
}
}