diff options
| author | Ruben Beltran del Rio <git@r.bdr.sh> | 2025-08-25 12:36:37 +0200 |
|---|---|---|
| committer | Ruben Beltran del Rio <git@r.bdr.sh> | 2025-08-25 12:36:37 +0200 |
| commit | e5de70f2c1dcac767bd34a6b90ac1797a7acb433 (patch) | |
| tree | 25a8c8f339fb5b496b460391ee06a9effeb64855 /src/renderer.rs | |
| parent | 6b909d95ec07848136a6f337db28318c1cd46c60 (diff) | |
| parent | d7bc21d19e168f3a99f54e5ba4866ed49f1187f1 (diff) | |
Merge branch 'rust'
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") + } + } + } +} |