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 ("drop_target_background", self.0.drop_target_background),
144 ("ghost_element_background", self.0.ghost_element_background),
145 ("ghost_element_hover", self.0.ghost_element_hover),
146 ("ghost_element_active", self.0.ghost_element_active),
147 ("ghost_element_selected", self.0.ghost_element_selected),
148 ("ghost_element_disabled", self.0.ghost_element_disabled),
149 ("text", self.0.text),
150 ("text_muted", self.0.text_muted),
151 ("text_placeholder", self.0.text_placeholder),
152 ("text_disabled", self.0.text_disabled),
153 ("text_accent", self.0.text_accent),
154 ("icon", self.0.icon),
155 ("icon_muted", self.0.icon_muted),
156 ("icon_disabled", self.0.icon_disabled),
157 ("icon_placeholder", self.0.icon_placeholder),
158 ("icon_accent", self.0.icon_accent),
159 ("status_bar_background", self.0.status_bar_background),
160 ("title_bar_background", self.0.title_bar_background),
161 ("toolbar_background", self.0.toolbar_background),
162 ("tab_bar_background", self.0.tab_bar_background),
163 ("tab_inactive_background", self.0.tab_inactive_background),
164 ("tab_active_background", self.0.tab_active_background),
165 ("editor_background", self.0.editor_background),
166 ("editor_gutter_background", self.0.editor_gutter_background),
167 (
168 "editor_subheader_background",
169 self.0.editor_subheader_background,
170 ),
171 (
172 "editor_active_line_background",
173 self.0.editor_active_line_background,
174 ),
175 (
176 "editor_highlighted_line_background",
177 self.0.editor_highlighted_line_background,
178 ),
179 ("editor_line_number", self.0.editor_line_number),
180 (
181 "editor_active_line_number",
182 self.0.editor_active_line_number,
183 ),
184 ("editor_invisible", self.0.editor_invisible),
185 ("editor_wrap_guide", self.0.editor_wrap_guide),
186 ("editor_active_wrap_guide", self.0.editor_active_wrap_guide),
187 (
188 "editor_document_highlight_read_background",
189 self.0.editor_document_highlight_read_background,
190 ),
191 (
192 "editor_document_highlight_write_background",
193 self.0.editor_document_highlight_write_background,
194 ),
195 ("terminal_background", self.0.terminal_background),
196 (
197 "terminal_ansi_bright_black",
198 self.0.terminal_ansi_bright_black,
199 ),
200 ("terminal_ansi_bright_red", self.0.terminal_ansi_bright_red),
201 (
202 "terminal_ansi_bright_green",
203 self.0.terminal_ansi_bright_green,
204 ),
205 (
206 "terminal_ansi_bright_yellow",
207 self.0.terminal_ansi_bright_yellow,
208 ),
209 (
210 "terminal_ansi_bright_blue",
211 self.0.terminal_ansi_bright_blue,
212 ),
213 (
214 "terminal_ansi_bright_magenta",
215 self.0.terminal_ansi_bright_magenta,
216 ),
217 (
218 "terminal_ansi_bright_cyan",
219 self.0.terminal_ansi_bright_cyan,
220 ),
221 (
222 "terminal_ansi_bright_white",
223 self.0.terminal_ansi_bright_white,
224 ),
225 ("terminal_ansi_black", self.0.terminal_ansi_black),
226 ("terminal_ansi_red", self.0.terminal_ansi_red),
227 ("terminal_ansi_green", self.0.terminal_ansi_green),
228 ("terminal_ansi_yellow", self.0.terminal_ansi_yellow),
229 ("terminal_ansi_blue", self.0.terminal_ansi_blue),
230 ("terminal_ansi_magenta", self.0.terminal_ansi_magenta),
231 ("terminal_ansi_cyan", self.0.terminal_ansi_cyan),
232 ("terminal_ansi_white", self.0.terminal_ansi_white),
233 ];
234
235 f.write_str("ThemeColorsRefinement {")?;
236
237 for (color_name, color) in theme_colors {
238 if let Some(color) = color {
239 f.write_str(color_name)?;
240 f.write_str(": ")?;
241 f.write_str("Some(")?;
242 HslaPrinter(color).fmt(f)?;
243 f.write_str(")")?;
244 f.write_str(",")?;
245 }
246 }
247
248 f.write_str("..Default::default()")?;
249 f.write_str("}")
250 }
251}
252
253pub struct StatusColorsPrinter<'a>(&'a StatusColors);
254
255impl<'a> Debug for StatusColorsPrinter<'a> {
256 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
257 f.debug_struct("StatusColors")
258 .field("conflict", &HslaPrinter(self.0.conflict))
259 .field("created", &HslaPrinter(self.0.created))
260 .field("deleted", &HslaPrinter(self.0.deleted))
261 .field("error", &HslaPrinter(self.0.error))
262 .field("hidden", &HslaPrinter(self.0.hidden))
263 .field("ignored", &HslaPrinter(self.0.ignored))
264 .field("info", &HslaPrinter(self.0.info))
265 .field("modified", &HslaPrinter(self.0.modified))
266 .field("renamed", &HslaPrinter(self.0.renamed))
267 .field("success", &HslaPrinter(self.0.success))
268 .field("warning", &HslaPrinter(self.0.warning))
269 .finish()
270 }
271}
272
273pub struct GitStatusColorsPrinter<'a>(&'a GitStatusColors);
274
275impl<'a> Debug for GitStatusColorsPrinter<'a> {
276 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
277 f.debug_struct("GitStatusColors")
278 .field("conflict", &HslaPrinter(self.0.conflict))
279 .field("created", &HslaPrinter(self.0.created))
280 .field("deleted", &HslaPrinter(self.0.deleted))
281 .field("ignored", &HslaPrinter(self.0.ignored))
282 .field("modified", &HslaPrinter(self.0.modified))
283 .field("renamed", &HslaPrinter(self.0.renamed))
284 .finish()
285 }
286}
287
288pub struct PlayerColorsPrinter<'a>(&'a PlayerColors);
289
290impl<'a> Debug for PlayerColorsPrinter<'a> {
291 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
292 f.debug_tuple("PlayerColors")
293 .field(&VecPrinter(
294 &self
295 .0
296 .0
297 .iter()
298 .map(|player_color| PlayerColorPrinter(player_color))
299 .collect(),
300 ))
301 .finish()
302 }
303}
304
305pub struct PlayerColorPrinter<'a>(&'a PlayerColor);
306
307impl<'a> Debug for PlayerColorPrinter<'a> {
308 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
309 f.debug_struct("PlayerColor")
310 .field("cursor", &HslaPrinter(self.0.cursor))
311 .field("background", &HslaPrinter(self.0.background))
312 .field("selection", &HslaPrinter(self.0.selection))
313 .finish()
314 }
315}
316
317pub struct SyntaxThemePrinter<'a>(&'a SyntaxTheme);
318
319impl<'a> Debug for SyntaxThemePrinter<'a> {
320 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
321 f.debug_struct("SyntaxTheme")
322 .field(
323 "highlights",
324 &VecPrinter(
325 &self
326 .0
327 .highlights
328 .iter()
329 .map(|(token, highlight)| {
330 (IntoPrinter(token), HslaPrinter(highlight.color.unwrap()))
331 })
332 .collect(),
333 ),
334 )
335 .finish()
336 }
337}