pub fn get_ansi_from_name(short_name: &str) -> Option<String> {
match short_name {
"red" => Some("\033[31m".to_string()),
"green" => Some("\033[32m".to_string()),
"yellow" => Some("\033[33m".to_string()),
"blue" => Some("\033[34m".to_string()),
"magenta" => Some("\033[35m".to_string()),
"cyan" => Some("\033[36m".to_string()),
_ => None,
}
}
pub fn get_ansi_from_rgb(r: u8, g: u8, b: u8) -> String {
format!("\033[38;2;{};{};{}m", r, g, b)
}
pub trait ColorIn {
fn to_ansi(&self) -> Option<String>;
}
impl ColorIn for &str {
fn to_ansi(&self) -> Option<String> {
get_ansi_from_name(self)
}
}
impl ColorIn for (u8, u8, u8) {
fn to_ansi(&self) -> Option<String> {
let (r, g, b) = *self;
format!("\033[38;2;{};{};{}m", r, g, b).into()
}
}
impl ColorIn for u8 {
fn to_ansi(&self) -> Option<String> {
Some(format!("\x1B[38;5;{}m", self))
}
}
pub fn reset() {
println!("\033[0m");
}
pub fn set_fg<C: ColorIn>(color: C) -> Option<String> {
let ret = color.to_ansi();
if None != ret {
println!("{}", ret.clone().unwrap()); return ret;
}
None
}
pub fn set_bg<C: ColorIn>(color: C) -> Option<String> {
let ret = color.to_ansi();
if None != ret {
println!("{}", ret.clone().unwrap());
return ret;
}
None
}