From 61cc3b93e3966d453e6405153d4e3fabac49524d Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Mon, 30 Oct 2023 10:40:46 -0400 Subject: [PATCH] Factor out `ThemePrinter` into its own module --- crates/theme_converter/src/main.rs | 174 +------------------- crates/theme_converter/src/theme_printer.rs | 174 ++++++++++++++++++++ 2 files changed, 181 insertions(+), 167 deletions(-) create mode 100644 crates/theme_converter/src/theme_printer.rs diff --git a/crates/theme_converter/src/main.rs b/crates/theme_converter/src/main.rs index 33a939d525ea96ca3a85ccf97b82367cb2b6d536..ec31296c1d8eb4fc65d43761c37bdb2c55ee3647 100644 --- a/crates/theme_converter/src/main.rs +++ b/crates/theme_converter/src/main.rs @@ -1,16 +1,20 @@ +mod theme_printer; + use std::borrow::Cow; use std::collections::HashMap; use std::fmt::{self, Debug}; use anyhow::{anyhow, Context, Result}; use clap::Parser; -use gpui2::{hsla, rgb, serde_json, AssetSource, Hsla, Rgba, SharedString}; +use gpui2::{hsla, rgb, serde_json, AssetSource, Hsla, SharedString}; use log::LevelFilter; use rust_embed::RustEmbed; use serde::de::Visitor; use serde::{Deserialize, Deserializer}; use simplelog::SimpleLogger; -use theme2::{PlayerTheme, SyntaxTheme, ThemeMetadata}; +use theme2::{PlayerTheme, SyntaxTheme}; + +use crate::theme_printer::ThemePrinter; #[derive(Parser)] #[command(author, version, about, long_about = None)] @@ -28,7 +32,7 @@ fn main() -> Result<()> { let theme = convert_theme(json_theme, legacy_theme)?; - println!("{:#?}", ThemePrinter(theme)); + println!("{:#?}", ThemePrinter::new(theme)); Ok(()) } @@ -321,167 +325,3 @@ where } deserializer.deserialize_map(SyntaxVisitor) } - -pub struct ThemePrinter(theme2::Theme); - -struct HslaPrinter(Hsla); - -impl Debug for HslaPrinter { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{:?}", IntoPrinter(&Rgba::from(self.0))) - } -} - -struct IntoPrinter<'a, D: Debug>(&'a D); - -impl<'a, D: Debug> Debug for IntoPrinter<'a, D> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{:?}.into()", self.0) - } -} - -impl Debug for ThemePrinter { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("Theme") - .field("metadata", &ThemeMetadataPrinter(self.0.metadata.clone())) - .field("transparent", &HslaPrinter(self.0.transparent)) - .field( - "mac_os_traffic_light_red", - &HslaPrinter(self.0.mac_os_traffic_light_red), - ) - .field( - "mac_os_traffic_light_yellow", - &HslaPrinter(self.0.mac_os_traffic_light_yellow), - ) - .field( - "mac_os_traffic_light_green", - &HslaPrinter(self.0.mac_os_traffic_light_green), - ) - .field("border", &HslaPrinter(self.0.border)) - .field("border_variant", &HslaPrinter(self.0.border_variant)) - .field("border_focused", &HslaPrinter(self.0.border_focused)) - .field( - "border_transparent", - &HslaPrinter(self.0.border_transparent), - ) - .field("elevated_surface", &HslaPrinter(self.0.elevated_surface)) - .field("surface", &HslaPrinter(self.0.surface)) - .field("background", &HslaPrinter(self.0.background)) - .field("filled_element", &HslaPrinter(self.0.filled_element)) - .field( - "filled_element_hover", - &HslaPrinter(self.0.filled_element_hover), - ) - .field( - "filled_element_active", - &HslaPrinter(self.0.filled_element_active), - ) - .field( - "filled_element_selected", - &HslaPrinter(self.0.filled_element_selected), - ) - .field( - "filled_element_disabled", - &HslaPrinter(self.0.filled_element_disabled), - ) - .field("ghost_element", &HslaPrinter(self.0.ghost_element)) - .field( - "ghost_element_hover", - &HslaPrinter(self.0.ghost_element_hover), - ) - .field( - "ghost_element_active", - &HslaPrinter(self.0.ghost_element_active), - ) - .field( - "ghost_element_selected", - &HslaPrinter(self.0.ghost_element_selected), - ) - .field( - "ghost_element_disabled", - &HslaPrinter(self.0.ghost_element_disabled), - ) - .field("text", &HslaPrinter(self.0.text)) - .field("text_muted", &HslaPrinter(self.0.text_muted)) - .field("text_placeholder", &HslaPrinter(self.0.text_placeholder)) - .field("text_disabled", &HslaPrinter(self.0.text_disabled)) - .field("text_accent", &HslaPrinter(self.0.text_accent)) - .field("icon_muted", &HslaPrinter(self.0.icon_muted)) - .field("syntax", &SyntaxThemePrinter(self.0.syntax.clone())) - .field("status_bar", &HslaPrinter(self.0.status_bar)) - .field("title_bar", &HslaPrinter(self.0.title_bar)) - .field("toolbar", &HslaPrinter(self.0.toolbar)) - .field("tab_bar", &HslaPrinter(self.0.tab_bar)) - .field("editor", &HslaPrinter(self.0.editor)) - .field("editor_subheader", &HslaPrinter(self.0.editor_subheader)) - .field( - "editor_active_line", - &HslaPrinter(self.0.editor_active_line), - ) - .field("terminal", &HslaPrinter(self.0.terminal)) - .field( - "image_fallback_background", - &HslaPrinter(self.0.image_fallback_background), - ) - .field("git_created", &HslaPrinter(self.0.git_created)) - .field("git_modified", &HslaPrinter(self.0.git_modified)) - .field("git_deleted", &HslaPrinter(self.0.git_deleted)) - .field("git_conflict", &HslaPrinter(self.0.git_conflict)) - .field("git_ignored", &HslaPrinter(self.0.git_ignored)) - .field("git_renamed", &HslaPrinter(self.0.git_renamed)) - .field("players", &self.0.players.map(PlayerThemePrinter)) - .finish() - } -} - -pub struct ThemeMetadataPrinter(ThemeMetadata); - -impl Debug for ThemeMetadataPrinter { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("ThemeMetadata") - .field("name", &IntoPrinter(&self.0.name)) - .field("is_light", &self.0.is_light) - .finish() - } -} - -pub struct SyntaxThemePrinter(SyntaxTheme); - -impl Debug for SyntaxThemePrinter { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("SyntaxTheme") - .field( - "highlights", - &VecPrinter( - &self - .0 - .highlights - .iter() - .map(|(token, highlight)| { - (IntoPrinter(token), HslaPrinter(highlight.color.unwrap())) - }) - .collect(), - ), - ) - .finish() - } -} - -pub struct VecPrinter<'a, T>(&'a Vec); - -impl<'a, T: Debug> Debug for VecPrinter<'a, T> { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "vec!{:?}", &self.0) - } -} - -pub struct PlayerThemePrinter(PlayerTheme); - -impl Debug for PlayerThemePrinter { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("PlayerTheme") - .field("cursor", &HslaPrinter(self.0.cursor)) - .field("selection", &HslaPrinter(self.0.selection)) - .finish() - } -} diff --git a/crates/theme_converter/src/theme_printer.rs b/crates/theme_converter/src/theme_printer.rs new file mode 100644 index 0000000000000000000000000000000000000000..3a9bdb159bed1ad10d7f65aa304f5259d7317b58 --- /dev/null +++ b/crates/theme_converter/src/theme_printer.rs @@ -0,0 +1,174 @@ +use std::fmt::{self, Debug}; + +use gpui2::{Hsla, Rgba}; +use theme2::{PlayerTheme, SyntaxTheme, Theme, ThemeMetadata}; + +pub struct ThemePrinter(Theme); + +impl ThemePrinter { + pub fn new(theme: Theme) -> Self { + Self(theme) + } +} + +struct HslaPrinter(Hsla); + +impl Debug for HslaPrinter { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{:?}", IntoPrinter(&Rgba::from(self.0))) + } +} + +struct IntoPrinter<'a, D: Debug>(&'a D); + +impl<'a, D: Debug> Debug for IntoPrinter<'a, D> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{:?}.into()", self.0) + } +} + +impl Debug for ThemePrinter { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("Theme") + .field("metadata", &ThemeMetadataPrinter(self.0.metadata.clone())) + .field("transparent", &HslaPrinter(self.0.transparent)) + .field( + "mac_os_traffic_light_red", + &HslaPrinter(self.0.mac_os_traffic_light_red), + ) + .field( + "mac_os_traffic_light_yellow", + &HslaPrinter(self.0.mac_os_traffic_light_yellow), + ) + .field( + "mac_os_traffic_light_green", + &HslaPrinter(self.0.mac_os_traffic_light_green), + ) + .field("border", &HslaPrinter(self.0.border)) + .field("border_variant", &HslaPrinter(self.0.border_variant)) + .field("border_focused", &HslaPrinter(self.0.border_focused)) + .field( + "border_transparent", + &HslaPrinter(self.0.border_transparent), + ) + .field("elevated_surface", &HslaPrinter(self.0.elevated_surface)) + .field("surface", &HslaPrinter(self.0.surface)) + .field("background", &HslaPrinter(self.0.background)) + .field("filled_element", &HslaPrinter(self.0.filled_element)) + .field( + "filled_element_hover", + &HslaPrinter(self.0.filled_element_hover), + ) + .field( + "filled_element_active", + &HslaPrinter(self.0.filled_element_active), + ) + .field( + "filled_element_selected", + &HslaPrinter(self.0.filled_element_selected), + ) + .field( + "filled_element_disabled", + &HslaPrinter(self.0.filled_element_disabled), + ) + .field("ghost_element", &HslaPrinter(self.0.ghost_element)) + .field( + "ghost_element_hover", + &HslaPrinter(self.0.ghost_element_hover), + ) + .field( + "ghost_element_active", + &HslaPrinter(self.0.ghost_element_active), + ) + .field( + "ghost_element_selected", + &HslaPrinter(self.0.ghost_element_selected), + ) + .field( + "ghost_element_disabled", + &HslaPrinter(self.0.ghost_element_disabled), + ) + .field("text", &HslaPrinter(self.0.text)) + .field("text_muted", &HslaPrinter(self.0.text_muted)) + .field("text_placeholder", &HslaPrinter(self.0.text_placeholder)) + .field("text_disabled", &HslaPrinter(self.0.text_disabled)) + .field("text_accent", &HslaPrinter(self.0.text_accent)) + .field("icon_muted", &HslaPrinter(self.0.icon_muted)) + .field("syntax", &SyntaxThemePrinter(self.0.syntax.clone())) + .field("status_bar", &HslaPrinter(self.0.status_bar)) + .field("title_bar", &HslaPrinter(self.0.title_bar)) + .field("toolbar", &HslaPrinter(self.0.toolbar)) + .field("tab_bar", &HslaPrinter(self.0.tab_bar)) + .field("editor", &HslaPrinter(self.0.editor)) + .field("editor_subheader", &HslaPrinter(self.0.editor_subheader)) + .field( + "editor_active_line", + &HslaPrinter(self.0.editor_active_line), + ) + .field("terminal", &HslaPrinter(self.0.terminal)) + .field( + "image_fallback_background", + &HslaPrinter(self.0.image_fallback_background), + ) + .field("git_created", &HslaPrinter(self.0.git_created)) + .field("git_modified", &HslaPrinter(self.0.git_modified)) + .field("git_deleted", &HslaPrinter(self.0.git_deleted)) + .field("git_conflict", &HslaPrinter(self.0.git_conflict)) + .field("git_ignored", &HslaPrinter(self.0.git_ignored)) + .field("git_renamed", &HslaPrinter(self.0.git_renamed)) + .field("players", &self.0.players.map(PlayerThemePrinter)) + .finish() + } +} + +pub struct ThemeMetadataPrinter(ThemeMetadata); + +impl Debug for ThemeMetadataPrinter { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("ThemeMetadata") + .field("name", &IntoPrinter(&self.0.name)) + .field("is_light", &self.0.is_light) + .finish() + } +} + +pub struct SyntaxThemePrinter(SyntaxTheme); + +impl Debug for SyntaxThemePrinter { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("SyntaxTheme") + .field( + "highlights", + &VecPrinter( + &self + .0 + .highlights + .iter() + .map(|(token, highlight)| { + (IntoPrinter(token), HslaPrinter(highlight.color.unwrap())) + }) + .collect(), + ), + ) + .finish() + } +} + +pub struct VecPrinter<'a, T>(&'a Vec); + +impl<'a, T: Debug> Debug for VecPrinter<'a, T> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "vec!{:?}", &self.0) + } +} + +pub struct PlayerThemePrinter(PlayerTheme); + +impl Debug for PlayerThemePrinter { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("PlayerTheme") + .field("cursor", &HslaPrinter(self.0.cursor)) + .field("selection", &HslaPrinter(self.0.selection)) + .finish() + } +}