use crate::color::sanitize_visible_text;
use crate::color::{Console, SymbolTheme, Tone};
use std::io::Write;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum Verdict {
Passed,
Warning,
Failed,
ActionRequired,
Skipped,
Info,
}
impl Verdict {
pub fn tone(self) -> Tone {
match self {
Self::Passed => Tone::Success,
Self::Warning => Tone::Warning,
Self::Failed => Tone::Error,
Self::ActionRequired => Tone::Warning,
Self::Skipped => Tone::Muted,
Self::Info => Tone::Info,
}
}
pub fn symbol(self, theme: SymbolTheme) -> &'static str {
match (self, theme) {
(Self::Passed, SymbolTheme::Unicode) => "✔",
(Self::Passed, SymbolTheme::Ascii) => "[OK]",
(Self::Warning, SymbolTheme::Unicode) => "⚠",
(Self::Warning, SymbolTheme::Ascii) => "[WARN]",
(Self::Failed, SymbolTheme::Unicode) => "✖",
(Self::Failed, SymbolTheme::Ascii) => "[FAIL]",
(Self::ActionRequired, SymbolTheme::Unicode) => "➜",
(Self::ActionRequired, SymbolTheme::Ascii) => "[ACT]",
(Self::Skipped, SymbolTheme::Unicode) => "⊝",
(Self::Skipped, SymbolTheme::Ascii) => "[SKIP]",
(Self::Info, SymbolTheme::Unicode) => "ℹ",
(Self::Info, SymbolTheme::Ascii) => "[INFO]",
}
}
pub fn label(self) -> &'static str {
match self {
Self::Passed => "PASSED",
Self::Warning => "WARNING",
Self::Failed => "FAILED",
Self::ActionRequired => "ACTION REQUIRED",
Self::Skipped => "SKIPPED",
Self::Info => "INFO",
}
}
pub fn write_to(
self,
console: Console,
message: &str,
writer: &mut (impl Write + ?Sized),
) -> std::io::Result<()> {
let sym = self.symbol(console.symbol_theme());
console.write_paint(self.tone(), sym, writer)?;
write!(writer, " {}", sanitize_visible_text(message))
}
pub fn render(self, console: Console, message: &str) -> String {
crate::internal::collect_to_string(|buf| self.write_to(console, message, buf))
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::color::ColorMode;
#[test]
fn verdict_ascii_rendering() {
let console = Console::new(ColorMode::Never, false).with_theme(SymbolTheme::Ascii);
assert_eq!(
Verdict::Passed.render(console, "All checks green"),
"[OK] All checks green"
);
assert_eq!(
Verdict::Failed.render(console, "2 errors found"),
"[FAIL] 2 errors found"
);
}
}