theme_printer.rs

  1use std::fmt::{self, Debug};
  2
  3use gpui2::{Hsla, Rgba};
  4use theme2::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata};
  5
  6pub struct ThemePrinter(Theme);
  7
  8impl ThemePrinter {
  9    pub fn new(theme: Theme) -> Self {
 10        Self(theme)
 11    }
 12}
 13
 14struct HslaPrinter(Hsla);
 15
 16impl Debug for HslaPrinter {
 17    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
 18        write!(f, "{:?}", IntoPrinter(&Rgba::from(self.0)))
 19    }
 20}
 21
 22struct IntoPrinter<'a, D: Debug>(&'a D);
 23
 24impl<'a, D: Debug> Debug for IntoPrinter<'a, D> {
 25    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
 26        write!(f, "{:?}.into()", self.0)
 27    }
 28}
 29
 30impl Debug for ThemePrinter {
 31    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
 32        f.debug_struct("Theme")
 33            .field("metadata", &ThemeMetadataPrinter(self.0.metadata.clone()))
 34            .field("transparent", &HslaPrinter(self.0.transparent))
 35            .field(
 36                "mac_os_traffic_light_red",
 37                &HslaPrinter(self.0.mac_os_traffic_light_red),
 38            )
 39            .field(
 40                "mac_os_traffic_light_yellow",
 41                &HslaPrinter(self.0.mac_os_traffic_light_yellow),
 42            )
 43            .field(
 44                "mac_os_traffic_light_green",
 45                &HslaPrinter(self.0.mac_os_traffic_light_green),
 46            )
 47            .field("border", &HslaPrinter(self.0.border))
 48            .field("border_variant", &HslaPrinter(self.0.border_variant))
 49            .field("border_focused", &HslaPrinter(self.0.border_focused))
 50            .field(
 51                "border_transparent",
 52                &HslaPrinter(self.0.border_transparent),
 53            )
 54            .field("elevated_surface", &HslaPrinter(self.0.elevated_surface))
 55            .field("surface", &HslaPrinter(self.0.surface))
 56            .field("background", &HslaPrinter(self.0.background))
 57            .field("filled_element", &HslaPrinter(self.0.filled_element))
 58            .field(
 59                "filled_element_hover",
 60                &HslaPrinter(self.0.filled_element_hover),
 61            )
 62            .field(
 63                "filled_element_active",
 64                &HslaPrinter(self.0.filled_element_active),
 65            )
 66            .field(
 67                "filled_element_selected",
 68                &HslaPrinter(self.0.filled_element_selected),
 69            )
 70            .field(
 71                "filled_element_disabled",
 72                &HslaPrinter(self.0.filled_element_disabled),
 73            )
 74            .field("ghost_element", &HslaPrinter(self.0.ghost_element))
 75            .field(
 76                "ghost_element_hover",
 77                &HslaPrinter(self.0.ghost_element_hover),
 78            )
 79            .field(
 80                "ghost_element_active",
 81                &HslaPrinter(self.0.ghost_element_active),
 82            )
 83            .field(
 84                "ghost_element_selected",
 85                &HslaPrinter(self.0.ghost_element_selected),
 86            )
 87            .field(
 88                "ghost_element_disabled",
 89                &HslaPrinter(self.0.ghost_element_disabled),
 90            )
 91            .field("text", &HslaPrinter(self.0.text))
 92            .field("text_muted", &HslaPrinter(self.0.text_muted))
 93            .field("text_placeholder", &HslaPrinter(self.0.text_placeholder))
 94            .field("text_disabled", &HslaPrinter(self.0.text_disabled))
 95            .field("text_accent", &HslaPrinter(self.0.text_accent))
 96            .field("icon_muted", &HslaPrinter(self.0.icon_muted))
 97            .field("syntax", &SyntaxThemePrinter(self.0.syntax.clone()))
 98            .field("status_bar", &HslaPrinter(self.0.status_bar))
 99            .field("title_bar", &HslaPrinter(self.0.title_bar))
100            .field("toolbar", &HslaPrinter(self.0.toolbar))
101            .field("tab_bar", &HslaPrinter(self.0.tab_bar))
102            .field("editor", &HslaPrinter(self.0.editor))
103            .field("editor_subheader", &HslaPrinter(self.0.editor_subheader))
104            .field(
105                "editor_active_line",
106                &HslaPrinter(self.0.editor_active_line),
107            )
108            .field("terminal", &HslaPrinter(self.0.terminal))
109            .field(
110                "image_fallback_background",
111                &HslaPrinter(self.0.image_fallback_background),
112            )
113            .field("git_created", &HslaPrinter(self.0.git_created))
114            .field("git_modified", &HslaPrinter(self.0.git_modified))
115            .field("git_deleted", &HslaPrinter(self.0.git_deleted))
116            .field("git_conflict", &HslaPrinter(self.0.git_conflict))
117            .field("git_ignored", &HslaPrinter(self.0.git_ignored))
118            .field("git_renamed", &HslaPrinter(self.0.git_renamed))
119            .field("players", &self.0.players.map(PlayerThemePrinter))
120            .finish()
121    }
122}
123
124pub struct ThemeMetadataPrinter(ThemeMetadata);
125
126impl Debug for ThemeMetadataPrinter {
127    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
128        f.debug_struct("ThemeMetadata")
129            .field("name", &IntoPrinter(&self.0.name))
130            .field("is_light", &self.0.is_light)
131            .finish()
132    }
133}
134
135pub struct SyntaxThemePrinter(SyntaxTheme);
136
137impl Debug for SyntaxThemePrinter {
138    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
139        f.debug_struct("SyntaxTheme")
140            .field(
141                "highlights",
142                &VecPrinter(
143                    &self
144                        .0
145                        .highlights
146                        .iter()
147                        .map(|(token, highlight)| {
148                            (IntoPrinter(token), HslaPrinter(highlight.color.unwrap()))
149                        })
150                        .collect(),
151                ),
152            )
153            .finish()
154    }
155}
156
157pub struct VecPrinter<'a, T>(&'a Vec<T>);
158
159impl<'a, T: Debug> Debug for VecPrinter<'a, T> {
160    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
161        write!(f, "vec!{:?}", &self.0)
162    }
163}
164
165pub struct PlayerThemePrinter(PlayerTheme);
166
167impl Debug for PlayerThemePrinter {
168    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
169        f.debug_struct("PlayerTheme")
170            .field("cursor", &HslaPrinter(self.0.cursor))
171            .field("selection", &HslaPrinter(self.0.selection))
172            .finish()
173    }
174}