theme_printer.rs

  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}