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            ("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}