use rand::{Rng, rng}; #[derive(Clone)] pub enum Renderer { Ansi, Color256, TrueColor, FakeColor, } impl Renderer { pub fn random() -> Self { let mut rng = rng(); let renderers = [Self::Ansi, Self::Color256, Self::TrueColor, Self::FakeColor]; let index = rng.random_range(0..renderers.len()); renderers.get(index).unwrap_or(&Self::Ansi).clone() } pub fn render(&self, red: u8, green: u8, blue: u8) -> String { match self { Renderer::Ansi => { let color_offset = ((u16::from(red) + u16::from(green) + u16::from(blue)) * 7) / (255 * 3); let color_number = 40 + color_offset; format!("\x1B[{color_number}m") } Renderer::Color256 => { let red_value = (u16::from(red) * 5) / 255; let green_value = (u16::from(green) * 5) / 255; let blue_value = (u16::from(blue) * 5) / 255; let color_number = 16 + 36 * red_value + 6 * green_value + blue_value; format!("\x1B[48;5;{color_number}m") } Renderer::TrueColor => { format!("\x1B[48;2;{red};{green};{blue}m") } Renderer::FakeColor => { format!("\x1B[28;2;{red};{green};{blue}m") } } } }