use std::fmt;
pub enum Colors {
None,
Black,
BlackBold,
Red,
RedBold,
Green,
GreenBold,
Yellow,
YellowBold,
Blue,
BlueBold,
Magenta,
MagentaBold,
Cyan,
CyanBold,
White,
WhiteBold,
Rgb(u8, u8, u8),
RgbBold(u8, u8, u8)
}
impl Colors {
pub fn print<I: IntoIterator>(&self, sep: impl fmt::Display, vec: I)
where
<I as IntoIterator>::Item: fmt::Display,
{
let mut iter = vec.into_iter().peekable();
while let Some(item) = iter.next() {
paint!(self, "{item}");
if iter.peek().is_some() {
print!("{}", sep);
}
}
}
pub fn println<I: IntoIterator>(&self, sep: impl fmt::Display, vec: I)
where
<I as IntoIterator>::Item: fmt::Display,
{
self.print(sep, vec);
println!();
}
}
impl From<&Colors> for u8 {
fn from(val: &Colors) -> Self {
match val {
Colors::None => 0,
Colors::Black | Colors::BlackBold => 30,
Colors::Red | Colors::RedBold => 31,
Colors::Green | Colors::GreenBold => 32,
Colors::Yellow | Colors::YellowBold => 33,
Colors::Blue | Colors::BlueBold => 34,
Colors::Magenta | Colors::MagentaBold => 35,
Colors::Cyan | Colors::CyanBold => 36,
Colors::White | Colors::WhiteBold => 37,
Colors::Rgb(_, _, _) | Colors::RgbBold(_, _, _) => 38,
}
}
}
impl From<&Colors> for (u8, u8) {
fn from(val: &Colors) -> Self {
match val {
Colors::None
| Colors::Black
| Colors::Red
| Colors::Green
| Colors::Yellow
| Colors::Blue
| Colors::Magenta
| Colors::Cyan
| Colors::White
| Colors::Rgb(_, _, _) => (val.into(), 22),
Colors::BlackBold
| Colors::RedBold
| Colors::GreenBold
| Colors::YellowBold
| Colors::BlueBold
| Colors::MagentaBold
| Colors::CyanBold
| Colors::WhiteBold
| Colors::RgbBold(_, _, _) => (val.into(), 1),
}
}
}
impl fmt::Display for Colors {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Colors::None => write!(f, ""),
Colors::Rgb(r, g, b) => write!(f, "\x1b[38;2;{};{};{}m", r, g, b),
Colors::RgbBold(r, g, b) => write!(f, "\x1b[38;2;{};{};{};1m", r, g, b),
_ => {
let cc: (u8, u8) = self.into();
write!(f, "\x1b[{};{}m", cc.0, cc.1)
}
}
}
}
#[macro_export]
macro_rules! paint {
($color:expr, $($arg:tt)*) => {{
print!("{}", $color);
print!($($arg)*);
print!("\x1b[0m");
}};
}
#[macro_export]
macro_rules! paintln {
($color:expr, $($arg:tt)*) => {{
$crate::paint!($color, $($arg)*);
println!("");
}};
}
pub mod config;
pub mod dirs;