summaryrefslogtreecommitdiff
path: root/src/renderer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/renderer.rs')
-rw-r--r--src/renderer.rs41
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")
+ }
+ }
+ }
+}