use std::fmt;
use crate::filter::FilterLevel;
#[cfg(windows)]
use wincolor;
#[allow(dead_code)]
pub struct RichContent<T>
where
T: fmt::Display,
{
text: T,
level: FilterLevel,
}
impl<T: fmt::Display> RichContent<T> {
pub fn new(content: T, level: FilterLevel) -> Self {
RichContent {
text: content,
level,
}
}
}
impl<T> fmt::Display for RichContent<T>
where
T: fmt::Display,
{
#[cfg(unix)]
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "\x1B[0;2;4;3{};4{}m",
self.level.fg_color().color_byte(),
self.level.bg_color().color_byte())?;
fmt::Display::fmt(&self.text, f)?;
write!(f, "\x1B[0m")?;
Ok(())
}
#[cfg(windows)]
#[allow(unused_must_use)]
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let mut con = wincolor::Console::stdout().unwrap();
con.fg(wincolor::Intense::Yes, self.level.fg_color().to_win_color());
con.bg(wincolor::Intense::Yes, self.level.bg_color().to_win_color());
write!(f, "{}", self.text)?;
con.reset();
Ok(())
}
}
#[allow(dead_code)]
#[derive(Copy, Clone)]
pub enum Color {
Black,
Red,
Green,
Yellow,
Blue,
Magenta,
Cyan,
White,
}
#[allow(dead_code)]
impl Color {
fn color_byte(self) -> char {
match self {
Color::Black => '0',
Color::Red => '1',
Color::Green => '2',
Color::Yellow => '3',
Color::Blue => '4',
Color::Magenta => '5',
Color::Cyan => '6',
Color::White => '7',
}
}
#[cfg(windows)]
fn to_win_color(&self) -> wincolor::Color {
match self {
Color::Black => wincolor::Color::Black,
Color::Red => wincolor::Color::Red,
Color::Green => wincolor::Color::Green,
Color::Yellow => wincolor::Color::Yellow,
Color::Blue => wincolor::Color::Blue,
Color::Magenta => wincolor::Color::Magenta,
Color::Cyan => wincolor::Color::Cyan,
Color::White => wincolor::Color::White,
}
}
}