use std::fmt::Write;
pub fn write_reset<W: Write>(f: &mut W) -> std::fmt::Result {
f.write_str("\x1b[0m")
}
pub fn write_bold<W: Write>(f: &mut W) -> std::fmt::Result {
f.write_str("\x1b[1m")
}
pub const RESET: &str = "\x1b[0m";
pub const BOLD: &str = "\x1b[1m";
pub const DIM: &str = "\x1b[2m";
pub fn write_dim<W: Write>(f: &mut W) -> std::fmt::Result {
f.write_str(DIM)
}
pub fn write_italic<W: Write>(f: &mut W) -> std::fmt::Result {
f.write_str("\x1b[3m")
}
pub fn write_underline<W: Write>(f: &mut W) -> std::fmt::Result {
f.write_str("\x1b[4m")
}
pub fn write_rgb<W: Write>(f: &mut W, r: u8, g: u8, b: u8) -> std::fmt::Result {
write!(f, "\x1b[38;2;{};{};{}m", r, g, b)
}
pub fn write_rgb_bg<W: Write>(f: &mut W, r: u8, g: u8, b: u8) -> std::fmt::Result {
write!(f, "\x1b[48;2;{};{};{}m", r, g, b)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_write_rgb() {
let mut out = String::new();
write_rgb(&mut out, 255, 0, 0).unwrap();
assert_eq!(out, "\x1b[38;2;255;0;0m");
let mut out = String::new();
write_rgb(&mut out, 0, 255, 0).unwrap();
assert_eq!(out, "\x1b[38;2;0;255;0m");
let mut out = String::new();
write_rgb(&mut out, 0, 0, 255).unwrap();
assert_eq!(out, "\x1b[38;2;0;0;255m");
}
#[test]
fn test_write_rgb_bg() {
let mut out = String::new();
write_rgb_bg(&mut out, 255, 0, 0).unwrap();
assert_eq!(out, "\x1b[48;2;255;0;0m");
let mut out = String::new();
write_rgb_bg(&mut out, 0, 255, 0).unwrap();
assert_eq!(out, "\x1b[48;2;0;255;0m");
let mut out = String::new();
write_rgb_bg(&mut out, 0, 0, 255).unwrap();
assert_eq!(out, "\x1b[48;2;0;0;255m");
}
#[test]
fn test_write_formatting() {
let mut out = String::new();
write_bold(&mut out).unwrap();
assert_eq!(out, "\x1b[1m");
let mut out = String::new();
write_dim(&mut out).unwrap();
assert_eq!(out, "\x1b[2m");
let mut out = String::new();
write_reset(&mut out).unwrap();
assert_eq!(out, "\x1b[0m");
}
}