diff options
Diffstat (limited to 'src/renderer.rs')
| -rw-r--r-- | src/renderer.rs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/renderer.rs b/src/renderer.rs new file mode 100644 index 0000000..b0e702d --- /dev/null +++ b/src/renderer.rs @@ -0,0 +1,41 @@ +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") + } + } + } +} |