1 | use crate::{AnsiColors, DynColor}; |
2 | use core::fmt; |
3 | |
4 | #[allow (unused_imports)] |
5 | use crate::OwoColorize; |
6 | |
7 | /// Available RGB colors for use with [`OwoColorize::color`](OwoColorize::color) |
8 | /// or [`OwoColorize::on_color`](OwoColorize::on_color) |
9 | #[derive (Copy, Clone, Debug, PartialEq, Eq)] |
10 | pub struct Rgb(pub u8, pub u8, pub u8); |
11 | |
12 | impl DynColor for Rgb { |
13 | fn fmt_ansi_fg(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
14 | let Rgb(r, g, b) = self; |
15 | write!(f, " \x1b[38;2; {}; {}; {}m" , r, g, b) |
16 | } |
17 | |
18 | fn fmt_ansi_bg(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
19 | let Rgb(r, g, b) = self; |
20 | write!(f, " \x1b[48;2; {}; {}; {}m" , r, g, b) |
21 | } |
22 | |
23 | fn fmt_raw_ansi_fg(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
24 | let Rgb(r, g, b) = self; |
25 | write!(f, "38;2; {}; {}; {}" , r, g, b) |
26 | } |
27 | |
28 | fn fmt_raw_ansi_bg(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
29 | let Rgb(r, g, b) = self; |
30 | write!(f, "48;2; {}; {}; {}" , r, g, b) |
31 | } |
32 | |
33 | #[doc (hidden)] |
34 | fn get_dyncolors_fg(&self) -> crate::DynColors { |
35 | let Rgb(r, g, b) = self; |
36 | crate::DynColors::Rgb(*r, *g, *b) |
37 | } |
38 | |
39 | #[doc (hidden)] |
40 | fn get_dyncolors_bg(&self) -> crate::DynColors { |
41 | self.get_dyncolors_fg() |
42 | } |
43 | } |
44 | |
45 | impl DynColor for str { |
46 | fn fmt_ansi_fg(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
47 | let color: AnsiColors = self.into(); |
48 | color.fmt_ansi_fg(f) |
49 | } |
50 | |
51 | fn fmt_ansi_bg(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
52 | let color: AnsiColors = self.into(); |
53 | color.fmt_ansi_bg(f) |
54 | } |
55 | |
56 | fn fmt_raw_ansi_fg(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
57 | let color: AnsiColors = self.into(); |
58 | color.fmt_raw_ansi_fg(f) |
59 | } |
60 | |
61 | fn fmt_raw_ansi_bg(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
62 | let color: AnsiColors = self.into(); |
63 | color.fmt_raw_ansi_bg(f) |
64 | } |
65 | |
66 | #[doc (hidden)] |
67 | fn get_dyncolors_fg(&self) -> crate::DynColors { |
68 | crate::DynColors::Ansi(self.into()) |
69 | } |
70 | |
71 | #[doc (hidden)] |
72 | fn get_dyncolors_bg(&self) -> crate::DynColors { |
73 | crate::DynColors::Ansi(self.into()) |
74 | } |
75 | } |
76 | |
77 | /// Implemented for drop-in replacement support for `colored` |
78 | impl<'a> From<&'a str> for AnsiColors { |
79 | fn from(color: &'a str) -> Self { |
80 | match color { |
81 | "black" => AnsiColors::Black, |
82 | "red" => AnsiColors::Red, |
83 | "green" => AnsiColors::Green, |
84 | "yellow" => AnsiColors::Yellow, |
85 | "blue" => AnsiColors::Blue, |
86 | "magenta" => AnsiColors::Magenta, |
87 | "purple" => AnsiColors::Magenta, |
88 | "cyan" => AnsiColors::Cyan, |
89 | "white" => AnsiColors::White, |
90 | "bright black" => AnsiColors::BrightBlack, |
91 | "bright red" => AnsiColors::BrightRed, |
92 | "bright green" => AnsiColors::BrightGreen, |
93 | "bright yellow" => AnsiColors::BrightYellow, |
94 | "bright blue" => AnsiColors::BrightBlue, |
95 | "bright magenta" => AnsiColors::BrightMagenta, |
96 | "bright cyan" => AnsiColors::BrightCyan, |
97 | "bright white" => AnsiColors::BrightWhite, |
98 | _ => AnsiColors::White, |
99 | } |
100 | } |
101 | } |
102 | |