1use std::fmt::{self, Debug};
2
3use gpui::{Hsla, Rgba};
4use theme::{
5 Appearance, GitStatusColors, PlayerColor, PlayerColors, StatusColors, SyntaxTheme,
6 SystemColors, ThemeColorsRefinement, UserTheme, UserThemeFamily, UserThemeStylesRefinement,
7};
8
9struct RawSyntaxPrinter<'a>(&'a str);
10
11impl<'a> Debug for RawSyntaxPrinter<'a> {
12 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
13 write!(f, "{}", self.0)
14 }
15}
16
17struct HslaPrinter(Hsla);
18
19impl Debug for HslaPrinter {
20 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
21 write!(f, "{:?}", IntoPrinter(&Rgba::from(self.0)))
22 }
23}
24
25struct IntoPrinter<'a, D: Debug>(&'a D);
26
27impl<'a, D: Debug> Debug for IntoPrinter<'a, D> {
28 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
29 write!(f, "{:?}.into()", self.0)
30 }
31}
32
33pub struct VecPrinter<'a, T>(&'a Vec<T>);
34
35impl<'a, T: Debug> Debug for VecPrinter<'a, T> {
36 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
37 write!(f, "vec!{:?}", &self.0)
38 }
39}
40
41pub struct UserThemeFamilyPrinter(UserThemeFamily);
42
43impl UserThemeFamilyPrinter {
44 pub fn new(theme_family: UserThemeFamily) -> Self {
45 Self(theme_family)
46 }
47}
48
49impl Debug for UserThemeFamilyPrinter {
50 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
51 f.debug_struct("UserThemeFamily")
52 .field("name", &IntoPrinter(&self.0.name))
53 .field("author", &IntoPrinter(&self.0.author))
54 .field(
55 "themes",
56 &VecPrinter(
57 &self
58 .0
59 .themes
60 .iter()
61 .map(|theme| UserThemePrinter(theme))
62 .collect(),
63 ),
64 )
65 .finish()
66 }
67}
68
69pub struct UserThemePrinter<'a>(&'a UserTheme);
70
71impl<'a> Debug for UserThemePrinter<'a> {
72 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
73 f.debug_struct("UserTheme")
74 .field("name", &IntoPrinter(&self.0.name))
75 .field("appearance", &AppearancePrinter(self.0.appearance))
76 .field("styles", &UserThemeStylesRefinementPrinter(&self.0.styles))
77 .finish()
78 }
79}
80
81pub struct AppearancePrinter(Appearance);
82
83impl Debug for AppearancePrinter {
84 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
85 write!(f, "Appearance::{:?}", self.0)
86 }
87}
88
89pub struct UserThemeStylesRefinementPrinter<'a>(&'a UserThemeStylesRefinement);
90
91impl<'a> Debug for UserThemeStylesRefinementPrinter<'a> {
92 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
93 f.debug_struct("UserThemeStylesRefinement")
94 .field("colors", &ThemeColorsRefinementPrinter(&self.0.colors))
95 .finish()
96 }
97}
98
99pub struct SystemColorsPrinter<'a>(&'a SystemColors);
100
101impl<'a> Debug for SystemColorsPrinter<'a> {
102 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
103 f.debug_struct("SystemColors")
104 .field("transparent", &HslaPrinter(self.0.transparent))
105 .field(
106 "mac_os_traffic_light_red",
107 &HslaPrinter(self.0.mac_os_traffic_light_red),
108 )
109 .field(
110 "mac_os_traffic_light_yellow",
111 &HslaPrinter(self.0.mac_os_traffic_light_yellow),
112 )
113 .field(
114 "mac_os_traffic_light_green",
115 &HslaPrinter(self.0.mac_os_traffic_light_green),
116 )
117 .finish()
118 }
119}
120
121pub struct ThemeColorsRefinementPrinter<'a>(&'a ThemeColorsRefinement);
122
123impl<'a> Debug for ThemeColorsRefinementPrinter<'a> {
124 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
125 let theme_colors = vec![
126 ("border", self.0.border),
127 ("border_variant", self.0.border_variant),
128 ("border_focused", self.0.border_focused),
129 ("border_selected", self.0.border_selected),
130 ("border_transparent", self.0.border_transparent),
131 ("border_disabled", self.0.border_disabled),
132 (
133 "elevated_surface_background",
134 self.0.elevated_surface_background,
135 ),
136 ("surface_background", self.0.surface_background),
137 ("background", self.0.background),
138 ("element_background", self.0.element_background),
139 ("element_hover", self.0.element_hover),
140 ("element_active", self.0.element_active),
141 ("element_selected", self.0.element_selected),
142 ("element_disabled", self.0.element_disabled),
143 ("element_placeholder", self.0.element_placeholder),
144 ("element_drop_target", self.0.element_drop_target),
145 ("ghost_element_background", self.0.ghost_element_background),
146 ("ghost_element_hover", self.0.ghost_element_hover),
147 ("ghost_element_active", self.0.ghost_element_active),
148 ("ghost_element_selected", self.0.ghost_element_selected),
149 ("ghost_element_disabled", self.0.ghost_element_disabled),
150 ("text", self.0.text),
151 ("text_muted", self.0.text_muted),
152 ("text_placeholder", self.0.text_placeholder),
153 ("text_disabled", self.0.text_disabled),
154 ("text_accent", self.0.text_accent),
155 ("icon", self.0.icon),
156 ("icon_muted", self.0.icon_muted),
157 ("icon_disabled", self.0.icon_disabled),
158 ("icon_placeholder", self.0.icon_placeholder),
159 ("icon_accent", self.0.icon_accent),
160 ("status_bar_background", self.0.status_bar_background),
161 ("title_bar_background", self.0.title_bar_background),
162 ("toolbar_background", self.0.toolbar_background),
163 ("tab_bar_background", self.0.tab_bar_background),
164 ("tab_inactive_background", self.0.tab_inactive_background),
165 ("tab_active_background", self.0.tab_active_background),
166 ("editor_background", self.0.editor_background),
167 ("editor_gutter_background", self.0.editor_gutter_background),
168 (
169 "editor_subheader_background",
170 self.0.editor_subheader_background,
171 ),
172 (
173 "editor_active_line_background",
174 self.0.editor_active_line_background,
175 ),
176 (
177 "editor_highlighted_line_background",
178 self.0.editor_highlighted_line_background,
179 ),
180 ("editor_line_number", self.0.editor_line_number),
181 (
182 "editor_active_line_number",
183 self.0.editor_active_line_number,
184 ),
185 ("editor_invisible", self.0.editor_invisible),
186 ("editor_wrap_guide", self.0.editor_wrap_guide),
187 ("editor_active_wrap_guide", self.0.editor_active_wrap_guide),
188 (
189 "editor_document_highlight_read_background",
190 self.0.editor_document_highlight_read_background,
191 ),
192 (
193 "editor_document_highlight_write_background",
194 self.0.editor_document_highlight_write_background,
195 ),
196 ("terminal_background", self.0.terminal_background),
197 (
198 "terminal_ansi_bright_black",
199 self.0.terminal_ansi_bright_black,
200 ),
201 ("terminal_ansi_bright_red", self.0.terminal_ansi_bright_red),
202 (
203 "terminal_ansi_bright_green",
204 self.0.terminal_ansi_bright_green,
205 ),
206 (
207 "terminal_ansi_bright_yellow",
208 self.0.terminal_ansi_bright_yellow,
209 ),
210 (
211 "terminal_ansi_bright_blue",
212 self.0.terminal_ansi_bright_blue,
213 ),
214 (
215 "terminal_ansi_bright_magenta",
216 self.0.terminal_ansi_bright_magenta,
217 ),
218 (
219 "terminal_ansi_bright_cyan",
220 self.0.terminal_ansi_bright_cyan,
221 ),
222 (
223 "terminal_ansi_bright_white",
224 self.0.terminal_ansi_bright_white,
225 ),
226 ("terminal_ansi_black", self.0.terminal_ansi_black),
227 ("terminal_ansi_red", self.0.terminal_ansi_red),
228 ("terminal_ansi_green", self.0.terminal_ansi_green),
229 ("terminal_ansi_yellow", self.0.terminal_ansi_yellow),
230 ("terminal_ansi_blue", self.0.terminal_ansi_blue),
231 ("terminal_ansi_magenta", self.0.terminal_ansi_magenta),
232 ("terminal_ansi_cyan", self.0.terminal_ansi_cyan),
233 ("terminal_ansi_white", self.0.terminal_ansi_white),
234 ];
235
236 f.write_str("ThemeColorsRefinement {")?;
237
238 for (color_name, color) in theme_colors {
239 if let Some(color) = color {
240 f.write_str(color_name)?;
241 f.write_str(": ")?;
242 f.write_str("Some(")?;
243 HslaPrinter(color).fmt(f)?;
244 f.write_str(")")?;
245 f.write_str(",")?;
246 }
247 }
248
249 f.write_str("..Default::default()")?;
250 f.write_str("}")
251 }
252}
253
254pub struct StatusColorsPrinter<'a>(&'a StatusColors);
255
256impl<'a> Debug for StatusColorsPrinter<'a> {
257 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
258 f.debug_struct("StatusColors")
259 .field("conflict", &HslaPrinter(self.0.conflict))
260 .field("created", &HslaPrinter(self.0.created))
261 .field("deleted", &HslaPrinter(self.0.deleted))
262 .field("error", &HslaPrinter(self.0.error))
263 .field("hidden", &HslaPrinter(self.0.hidden))
264 .field("ignored", &HslaPrinter(self.0.ignored))
265 .field("info", &HslaPrinter(self.0.info))
266 .field("modified", &HslaPrinter(self.0.modified))
267 .field("renamed", &HslaPrinter(self.0.renamed))
268 .field("success", &HslaPrinter(self.0.success))
269 .field("warning", &HslaPrinter(self.0.warning))
270 .finish()
271 }
272}
273
274pub struct GitStatusColorsPrinter<'a>(&'a GitStatusColors);
275
276impl<'a> Debug for GitStatusColorsPrinter<'a> {
277 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
278 f.debug_struct("GitStatusColors")
279 .field("conflict", &HslaPrinter(self.0.conflict))
280 .field("created", &HslaPrinter(self.0.created))
281 .field("deleted", &HslaPrinter(self.0.deleted))
282 .field("ignored", &HslaPrinter(self.0.ignored))
283 .field("modified", &HslaPrinter(self.0.modified))
284 .field("renamed", &HslaPrinter(self.0.renamed))
285 .finish()
286 }
287}
288
289pub struct PlayerColorsPrinter<'a>(&'a PlayerColors);
290
291impl<'a> Debug for PlayerColorsPrinter<'a> {
292 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
293 f.debug_tuple("PlayerColors")
294 .field(&VecPrinter(
295 &self
296 .0
297 .0
298 .iter()
299 .map(|player_color| PlayerColorPrinter(player_color))
300 .collect(),
301 ))
302 .finish()
303 }
304}
305
306pub struct PlayerColorPrinter<'a>(&'a PlayerColor);
307
308impl<'a> Debug for PlayerColorPrinter<'a> {
309 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
310 f.debug_struct("PlayerColor")
311 .field("cursor", &HslaPrinter(self.0.cursor))
312 .field("background", &HslaPrinter(self.0.background))
313 .field("selection", &HslaPrinter(self.0.selection))
314 .finish()
315 }
316}
317
318pub struct SyntaxThemePrinter<'a>(&'a SyntaxTheme);
319
320impl<'a> Debug for SyntaxThemePrinter<'a> {
321 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
322 f.debug_struct("SyntaxTheme")
323 .field(
324 "highlights",
325 &VecPrinter(
326 &self
327 .0
328 .highlights
329 .iter()
330 .map(|(token, highlight)| {
331 (IntoPrinter(token), HslaPrinter(highlight.color.unwrap()))
332 })
333 .collect(),
334 ),
335 )
336 .finish()
337 }
338}