pub mod palette {
pub const GREEN: (u8, u8, u8) = (0x00, 0xff, 0x80);
pub const CYAN: (u8, u8, u8) = (0x00, 0xff, 0xff);
pub const YELLOW: (u8, u8, u8) = (0xff, 0xdc, 0x00);
pub const ORANGE: (u8, u8, u8) = (0xff, 0x8c, 0x00);
pub const RED: (u8, u8, u8) = (0xff, 0x3c, 0x3c);
pub const DIM: (u8, u8, u8) = (0x50, 0x50, 0x64);
}
pub const fn quality_rgb(quality: crate::types::ConnectionQuality) -> (u8, u8, u8) {
use crate::types::ConnectionQuality::*;
match quality {
Excellent => palette::GREEN,
Good => palette::CYAN,
Average => palette::YELLOW,
Poor => palette::ORANGE,
VeryPoor => palette::RED,
Failed => palette::DIM,
}
}
#[macro_export]
macro_rules! quality_color_fn {
(
$(#[$meta:meta])*
$vis:vis fn $name:ident -> $Color:ty { $ctor:expr }
) => {
$(#[$meta])*
$vis fn $name(quality: $crate::types::ConnectionQuality) -> $Color {
let (r, g, b) = $crate::presentation::quality_rgb(quality);
let ctor = $ctor;
ctor(r, g, b)
}
};
}
#[cfg(test)]
mod tests {
use crate::types::ConnectionQuality;
#[test]
fn quality_rgb_is_stable() {
assert_eq!(
super::quality_rgb(ConnectionQuality::Excellent),
super::palette::GREEN
);
assert_eq!(
super::quality_rgb(ConnectionQuality::Good),
super::palette::CYAN
);
assert_eq!(
super::quality_rgb(ConnectionQuality::Failed),
super::palette::DIM
);
}
crate::quality_color_fn!(fn tuple_color -> (u8, u8, u8) { |r, g, b| (r, g, b) });
#[test]
fn macro_uses_canonical_palette() {
assert_eq!(
tuple_color(ConnectionQuality::Average),
super::palette::YELLOW
);
assert_eq!(tuple_color(ConnectionQuality::Poor), super::palette::ORANGE);
assert_eq!(
tuple_color(ConnectionQuality::VeryPoor),
super::palette::RED
);
}
}