1use std::fmt::{self, Debug};
2
3use gpui::{Hsla, Rgba};
4use theme::{
5 GitStatusColors, PlayerColor, PlayerColors, StatusColors, SyntaxTheme, SystemColors,
6 ThemeColors, ThemeFamily, ThemeStyles, ThemeVariant,
7};
8
9struct HslaPrinter(Hsla);
10
11impl Debug for HslaPrinter {
12 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
13 write!(f, "{:?}", IntoPrinter(&Rgba::from(self.0)))
14 }
15}
16
17struct IntoPrinter<'a, D: Debug>(&'a D);
18
19impl<'a, D: Debug> Debug for IntoPrinter<'a, D> {
20 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
21 write!(f, "{:?}.into()", self.0)
22 }
23}
24
25pub struct VecPrinter<'a, T>(&'a Vec<T>);
26
27impl<'a, T: Debug> Debug for VecPrinter<'a, T> {
28 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
29 write!(f, "vec!{:?}", &self.0)
30 }
31}
32
33pub struct ThemeFamilyPrinter(ThemeFamily);
34
35impl ThemeFamilyPrinter {
36 pub fn new(theme_family: ThemeFamily) -> Self {
37 Self(theme_family)
38 }
39}
40
41impl Debug for ThemeFamilyPrinter {
42 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
43 f.debug_struct("ThemeFamily")
44 .field("id", &IntoPrinter(&self.0.id))
45 .field("name", &IntoPrinter(&self.0.name))
46 .field("author", &IntoPrinter(&self.0.author))
47 .field(
48 "themes",
49 &VecPrinter(
50 &self
51 .0
52 .themes
53 .iter()
54 .map(|theme| ThemeVariantPrinter(theme))
55 .collect(),
56 ),
57 )
58 .finish()
59 }
60}
61
62pub struct ThemeVariantPrinter<'a>(&'a ThemeVariant);
63
64impl<'a> Debug for ThemeVariantPrinter<'a> {
65 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
66 f.debug_struct("ThemeVariant")
67 .field("id", &IntoPrinter(&self.0.id))
68 .field("name", &IntoPrinter(&self.0.name))
69 .field("appearance", &self.0.appearance)
70 .field("styles", &ThemeStylesPrinter(&self.0.styles))
71 .finish()
72 }
73}
74
75pub struct ThemeStylesPrinter<'a>(&'a ThemeStyles);
76
77impl<'a> Debug for ThemeStylesPrinter<'a> {
78 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
79 f.debug_struct("ThemeStyles")
80 .field("system", &SystemColorsPrinter(&self.0.system))
81 .field("colors", &ThemeColorsPrinter(&self.0.colors))
82 .field("status", &StatusColorsPrinter(&self.0.status))
83 .field("git", &GitStatusColorsPrinter(&self.0.git))
84 .field("player", &PlayerColorsPrinter(&self.0.player))
85 .field("syntax", &SyntaxThemePrinter(&self.0.syntax))
86 .finish()
87 }
88}
89
90pub struct SystemColorsPrinter<'a>(&'a SystemColors);
91
92impl<'a> Debug for SystemColorsPrinter<'a> {
93 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
94 f.debug_struct("SystemColors")
95 .field("transparent", &HslaPrinter(self.0.transparent))
96 .field(
97 "mac_os_traffic_light_red",
98 &HslaPrinter(self.0.mac_os_traffic_light_red),
99 )
100 .field(
101 "mac_os_traffic_light_yellow",
102 &HslaPrinter(self.0.mac_os_traffic_light_yellow),
103 )
104 .field(
105 "mac_os_traffic_light_green",
106 &HslaPrinter(self.0.mac_os_traffic_light_green),
107 )
108 .finish()
109 }
110}
111
112pub struct ThemeColorsPrinter<'a>(&'a ThemeColors);
113
114impl<'a> Debug for ThemeColorsPrinter<'a> {
115 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
116 f.debug_struct("ThemeColors")
117 .field("border", &HslaPrinter(self.0.border))
118 .field("border_variant", &HslaPrinter(self.0.border_variant))
119 .field("border_focused", &HslaPrinter(self.0.border_focused))
120 .field(
121 "border_transparent",
122 &HslaPrinter(self.0.border_transparent),
123 )
124 .field("elevated_surface", &HslaPrinter(self.0.elevated_surface))
125 .field("surface", &HslaPrinter(self.0.surface))
126 .field("background", &HslaPrinter(self.0.background))
127 .field("element", &HslaPrinter(self.0.element))
128 .field("element_hover", &HslaPrinter(self.0.element_hover))
129 .field("element_active", &HslaPrinter(self.0.element_active))
130 .field("element_selected", &HslaPrinter(self.0.element_selected))
131 .field("element_disabled", &HslaPrinter(self.0.element_disabled))
132 .field(
133 "element_placeholder",
134 &HslaPrinter(self.0.element_placeholder),
135 )
136 .field(
137 "element_drop_target",
138 &HslaPrinter(self.0.element_drop_target),
139 )
140 .field("ghost_element", &HslaPrinter(self.0.ghost_element))
141 .field(
142 "ghost_element_hover",
143 &HslaPrinter(self.0.ghost_element_hover),
144 )
145 .field(
146 "ghost_element_active",
147 &HslaPrinter(self.0.ghost_element_active),
148 )
149 .field(
150 "ghost_element_selected",
151 &HslaPrinter(self.0.ghost_element_selected),
152 )
153 .field(
154 "ghost_element_disabled",
155 &HslaPrinter(self.0.ghost_element_disabled),
156 )
157 .field("text", &HslaPrinter(self.0.text))
158 .field("text_muted", &HslaPrinter(self.0.text_muted))
159 .field("text_placeholder", &HslaPrinter(self.0.text_placeholder))
160 .field("text_disabled", &HslaPrinter(self.0.text_disabled))
161 .field("text_accent", &HslaPrinter(self.0.text_accent))
162 .field("icon", &HslaPrinter(self.0.icon))
163 .field("icon_muted", &HslaPrinter(self.0.icon_muted))
164 .field("icon_disabled", &HslaPrinter(self.0.icon_disabled))
165 .field("icon_placeholder", &HslaPrinter(self.0.icon_placeholder))
166 .field("icon_accent", &HslaPrinter(self.0.icon_accent))
167 .field("status_bar", &HslaPrinter(self.0.status_bar))
168 .field("title_bar", &HslaPrinter(self.0.title_bar))
169 .field("toolbar", &HslaPrinter(self.0.toolbar))
170 .field("tab_bar", &HslaPrinter(self.0.tab_bar))
171 .field("tab_inactive", &HslaPrinter(self.0.tab_inactive))
172 .field("tab_active", &HslaPrinter(self.0.tab_active))
173 .field("editor", &HslaPrinter(self.0.editor))
174 .field("editor_subheader", &HslaPrinter(self.0.editor_subheader))
175 .field(
176 "editor_active_line",
177 &HslaPrinter(self.0.editor_active_line),
178 )
179 .finish()
180 }
181}
182
183pub struct StatusColorsPrinter<'a>(&'a StatusColors);
184
185impl<'a> Debug for StatusColorsPrinter<'a> {
186 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
187 f.debug_struct("StatusColors")
188 .field("conflict", &HslaPrinter(self.0.conflict))
189 .field("created", &HslaPrinter(self.0.created))
190 .field("deleted", &HslaPrinter(self.0.deleted))
191 .field("error", &HslaPrinter(self.0.error))
192 .field("hidden", &HslaPrinter(self.0.hidden))
193 .field("ignored", &HslaPrinter(self.0.ignored))
194 .field("info", &HslaPrinter(self.0.info))
195 .field("modified", &HslaPrinter(self.0.modified))
196 .field("renamed", &HslaPrinter(self.0.renamed))
197 .field("success", &HslaPrinter(self.0.success))
198 .field("warning", &HslaPrinter(self.0.warning))
199 .finish()
200 }
201}
202
203pub struct GitStatusColorsPrinter<'a>(&'a GitStatusColors);
204
205impl<'a> Debug for GitStatusColorsPrinter<'a> {
206 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
207 f.debug_struct("GitStatusColors")
208 .field("conflict", &HslaPrinter(self.0.conflict))
209 .field("created", &HslaPrinter(self.0.created))
210 .field("deleted", &HslaPrinter(self.0.deleted))
211 .field("ignored", &HslaPrinter(self.0.ignored))
212 .field("modified", &HslaPrinter(self.0.modified))
213 .field("renamed", &HslaPrinter(self.0.renamed))
214 .finish()
215 }
216}
217
218pub struct PlayerColorsPrinter<'a>(&'a PlayerColors);
219
220impl<'a> Debug for PlayerColorsPrinter<'a> {
221 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
222 f.debug_tuple("PlayerColors")
223 .field(&VecPrinter(
224 &self
225 .0
226 .0
227 .iter()
228 .map(|player_color| PlayerColorPrinter(player_color))
229 .collect(),
230 ))
231 .finish()
232 }
233}
234
235pub struct PlayerColorPrinter<'a>(&'a PlayerColor);
236
237impl<'a> Debug for PlayerColorPrinter<'a> {
238 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
239 f.debug_struct("PlayerColor")
240 .field("cursor", &HslaPrinter(self.0.cursor))
241 .field("background", &HslaPrinter(self.0.background))
242 .field("selection", &HslaPrinter(self.0.selection))
243 .finish()
244 }
245}
246
247pub struct SyntaxThemePrinter<'a>(&'a SyntaxTheme);
248
249impl<'a> Debug for SyntaxThemePrinter<'a> {
250 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
251 f.debug_struct("SyntaxTheme")
252 .field(
253 "highlights",
254 &VecPrinter(
255 &self
256 .0
257 .highlights
258 .iter()
259 .map(|(token, highlight)| {
260 (IntoPrinter(token), HslaPrinter(highlight.color.unwrap()))
261 })
262 .collect(),
263 ),
264 )
265 .finish()
266 }
267}