use anstyle::{Ansi256Color, AnsiColor, Color, Style};
use crate::vocabulary::Role;
#[must_use]
pub(crate) fn style_for(role: Role, deep: bool) -> Style {
let colour = match (role, deep) {
(Role::Meadow, true) => Color::Ansi256(Ansi256Color(29)),
(Role::Bark, true) => Color::Ansi256(Ansi256Color(166)),
(Role::Butter, true) => Color::Ansi256(Ansi256Color(221)),
(Role::Ink3, true) => Color::Ansi256(Ansi256Color(245)),
(Role::Meadow, false) => Color::Ansi(AnsiColor::Green),
(Role::Bark, false) => Color::Ansi(AnsiColor::Red),
(Role::Butter, false) => Color::Ansi(AnsiColor::Yellow),
(Role::Ink3, false) => Color::Ansi(AnsiColor::BrightBlack),
};
Style::new().fg_color(Some(colour))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn every_role_resolves_a_foreground_at_both_tiers() {
for role in [Role::Meadow, Role::Bark, Role::Butter, Role::Ink3] {
for deep in [true, false] {
assert!(
style_for(role, deep).get_fg_color().is_some(),
"{role:?} at deep={deep} must set a foreground"
);
}
}
}
#[test]
fn bark_is_the_only_role_painted_bark() {
for deep in [true, false] {
let bark = style_for(Role::Bark, deep);
for other in [Role::Meadow, Role::Butter, Role::Ink3] {
assert_ne!(
style_for(other, deep),
bark,
"{other:?} at deep={deep} must not share bark's colour"
);
}
}
}
#[test]
fn the_four_roles_are_pairwise_distinct_at_each_tier() {
for deep in [true, false] {
let styles = [
style_for(Role::Meadow, deep),
style_for(Role::Bark, deep),
style_for(Role::Butter, deep),
style_for(Role::Ink3, deep),
];
for (i, a) in styles.iter().enumerate() {
for (j, b) in styles.iter().enumerate() {
if i != j {
assert_ne!(
a, b,
"roles at index {i} and {j} share a colour at deep={deep}"
);
}
}
}
}
}
}