termprofile/convert/
adapt.rs1use anstyle::{Ansi256Color, AnsiColor, Color, RgbColor, Style};
2
3pub trait AdaptableColor {
5 fn as_rgb(&self) -> Option<RgbColor>;
7 fn as_ansi_256(&self) -> Option<Ansi256Color>;
9 fn as_ansi_16(&self) -> Option<AnsiColor>;
11 fn from_ansi_256(color: Ansi256Color) -> Self;
13 fn from_ansi_16(color: AnsiColor) -> Self;
15}
16
17pub trait AdaptableStyle: Default {
19 type Color: AdaptableColor;
21
22 fn get_fg_color(&self) -> Option<Self::Color>;
24 fn get_bg_color(&self) -> Option<Self::Color>;
26 fn get_underline_color(&self) -> Option<Self::Color>;
28 fn fg_color(self, color: Option<Self::Color>) -> Self;
30 fn bg_color(self, color: Option<Self::Color>) -> Self;
32 fn underline_color(self, color: Option<Self::Color>) -> Self;
34}
35
36impl AdaptableColor for Color {
37 fn as_rgb(&self) -> Option<RgbColor> {
38 if let Self::Rgb(color) = self {
39 Some(*color)
40 } else {
41 None
42 }
43 }
44
45 fn as_ansi_256(&self) -> Option<Ansi256Color> {
46 if let Self::Ansi256(color) = self {
47 Some(*color)
48 } else {
49 None
50 }
51 }
52
53 fn as_ansi_16(&self) -> Option<AnsiColor> {
54 if let Self::Ansi(color) = self {
55 Some(*color)
56 } else {
57 None
58 }
59 }
60
61 fn from_ansi_256(color: Ansi256Color) -> Self {
62 color.into()
63 }
64
65 fn from_ansi_16(color: AnsiColor) -> Self {
66 color.into()
67 }
68}
69
70impl AdaptableStyle for Style {
71 type Color = Color;
72
73 fn get_fg_color(&self) -> Option<Self::Color> {
74 (*self).get_fg_color()
75 }
76
77 fn get_bg_color(&self) -> Option<Self::Color> {
78 (*self).get_bg_color()
79 }
80
81 fn get_underline_color(&self) -> Option<Self::Color> {
82 (*self).get_underline_color()
83 }
84
85 fn fg_color(self, color: Option<Self::Color>) -> Self {
86 self.fg_color(color)
87 }
88
89 fn bg_color(self, color: Option<Self::Color>) -> Self {
90 self.bg_color(color)
91 }
92
93 fn underline_color(self, color: Option<Self::Color>) -> Self {
94 self.underline_color(color)
95 }
96}