vscode.rs

  1use anyhow::Result;
  2use gpui::{Hsla, Refineable, Rgba};
  3use serde::Deserialize;
  4use theme::{
  5    Appearance, GitStatusColors, PlayerColors, StatusColors, SyntaxTheme, SystemColors,
  6    ThemeColors, ThemeColorsRefinement, ThemeStyles, ThemeVariant,
  7};
  8
  9use crate::ThemeMetadata;
 10
 11#[derive(Deserialize, Debug)]
 12pub struct VsCodeTheme {
 13    #[serde(rename = "$schema")]
 14    pub schema: Option<String>,
 15    pub name: Option<String>,
 16    pub author: Option<String>,
 17    pub maintainers: Option<Vec<String>>,
 18    #[serde(rename = "semanticClass")]
 19    pub semantic_class: Option<String>,
 20    #[serde(rename = "semanticHighlighting")]
 21    pub semantic_highlighting: Option<bool>,
 22    pub colors: VsCodeColors,
 23}
 24
 25#[derive(Debug, Deserialize)]
 26pub struct VsCodeColors {
 27    #[serde(rename = "terminal.background")]
 28    pub terminal_background: Option<String>,
 29    #[serde(rename = "terminal.foreground")]
 30    pub terminal_foreground: Option<String>,
 31    #[serde(rename = "terminal.ansiBrightBlack")]
 32    pub terminal_ansi_bright_black: Option<String>,
 33    #[serde(rename = "terminal.ansiBrightRed")]
 34    pub terminal_ansi_bright_red: Option<String>,
 35    #[serde(rename = "terminal.ansiBrightGreen")]
 36    pub terminal_ansi_bright_green: Option<String>,
 37    #[serde(rename = "terminal.ansiBrightYellow")]
 38    pub terminal_ansi_bright_yellow: Option<String>,
 39    #[serde(rename = "terminal.ansiBrightBlue")]
 40    pub terminal_ansi_bright_blue: Option<String>,
 41    #[serde(rename = "terminal.ansiBrightMagenta")]
 42    pub terminal_ansi_bright_magenta: Option<String>,
 43    #[serde(rename = "terminal.ansiBrightCyan")]
 44    pub terminal_ansi_bright_cyan: Option<String>,
 45    #[serde(rename = "terminal.ansiBrightWhite")]
 46    pub terminal_ansi_bright_white: Option<String>,
 47    #[serde(rename = "terminal.ansiBlack")]
 48    pub terminal_ansi_black: Option<String>,
 49    #[serde(rename = "terminal.ansiRed")]
 50    pub terminal_ansi_red: Option<String>,
 51    #[serde(rename = "terminal.ansiGreen")]
 52    pub terminal_ansi_green: Option<String>,
 53    #[serde(rename = "terminal.ansiYellow")]
 54    pub terminal_ansi_yellow: Option<String>,
 55    #[serde(rename = "terminal.ansiBlue")]
 56    pub terminal_ansi_blue: Option<String>,
 57    #[serde(rename = "terminal.ansiMagenta")]
 58    pub terminal_ansi_magenta: Option<String>,
 59    #[serde(rename = "terminal.ansiCyan")]
 60    pub terminal_ansi_cyan: Option<String>,
 61    #[serde(rename = "terminal.ansiWhite")]
 62    pub terminal_ansi_white: Option<String>,
 63    #[serde(rename = "focusBorder")]
 64    pub focus_border: Option<String>,
 65    pub foreground: Option<String>,
 66    #[serde(rename = "selection.background")]
 67    pub selection_background: Option<String>,
 68    #[serde(rename = "errorForeground")]
 69    pub error_foreground: Option<String>,
 70    #[serde(rename = "button.background")]
 71    pub button_background: Option<String>,
 72    #[serde(rename = "button.foreground")]
 73    pub button_foreground: Option<String>,
 74    #[serde(rename = "button.secondaryBackground")]
 75    pub button_secondary_background: Option<String>,
 76    #[serde(rename = "button.secondaryForeground")]
 77    pub button_secondary_foreground: Option<String>,
 78    #[serde(rename = "button.secondaryHoverBackground")]
 79    pub button_secondary_hover_background: Option<String>,
 80    #[serde(rename = "dropdown.background")]
 81    pub dropdown_background: Option<String>,
 82    #[serde(rename = "dropdown.border")]
 83    pub dropdown_border: Option<String>,
 84    #[serde(rename = "dropdown.foreground")]
 85    pub dropdown_foreground: Option<String>,
 86    #[serde(rename = "input.background")]
 87    pub input_background: Option<String>,
 88    #[serde(rename = "input.foreground")]
 89    pub input_foreground: Option<String>,
 90    #[serde(rename = "input.border")]
 91    pub input_border: Option<String>,
 92    #[serde(rename = "input.placeholderForeground")]
 93    pub input_placeholder_foreground: Option<String>,
 94    #[serde(rename = "inputOption.activeBorder")]
 95    pub input_option_active_border: Option<String>,
 96    #[serde(rename = "inputValidation.infoBorder")]
 97    pub input_validation_info_border: Option<String>,
 98    #[serde(rename = "inputValidation.warningBorder")]
 99    pub input_validation_warning_border: Option<String>,
100    #[serde(rename = "inputValidation.errorBorder")]
101    pub input_validation_error_border: Option<String>,
102    #[serde(rename = "badge.foreground")]
103    pub badge_foreground: Option<String>,
104    #[serde(rename = "badge.background")]
105    pub badge_background: Option<String>,
106    #[serde(rename = "progressBar.background")]
107    pub progress_bar_background: Option<String>,
108    #[serde(rename = "list.activeSelectionBackground")]
109    pub list_active_selection_background: Option<String>,
110    #[serde(rename = "list.activeSelectionForeground")]
111    pub list_active_selection_foreground: Option<String>,
112    #[serde(rename = "list.dropBackground")]
113    pub list_drop_background: Option<String>,
114    #[serde(rename = "list.focusBackground")]
115    pub list_focus_background: Option<String>,
116    #[serde(rename = "list.highlightForeground")]
117    pub list_highlight_foreground: Option<String>,
118    #[serde(rename = "list.hoverBackground")]
119    pub list_hover_background: Option<String>,
120    #[serde(rename = "list.inactiveSelectionBackground")]
121    pub list_inactive_selection_background: Option<String>,
122    #[serde(rename = "list.warningForeground")]
123    pub list_warning_foreground: Option<String>,
124    #[serde(rename = "list.errorForeground")]
125    pub list_error_foreground: Option<String>,
126    #[serde(rename = "activityBar.background")]
127    pub activity_bar_background: Option<String>,
128    #[serde(rename = "activityBar.inactiveForeground")]
129    pub activity_bar_inactive_foreground: Option<String>,
130    #[serde(rename = "activityBar.foreground")]
131    pub activity_bar_foreground: Option<String>,
132    #[serde(rename = "activityBar.activeBorder")]
133    pub activity_bar_active_border: Option<String>,
134    #[serde(rename = "activityBar.activeBackground")]
135    pub activity_bar_active_background: Option<String>,
136    #[serde(rename = "activityBarBadge.background")]
137    pub activity_bar_badge_background: Option<String>,
138    #[serde(rename = "activityBarBadge.foreground")]
139    pub activity_bar_badge_foreground: Option<String>,
140    #[serde(rename = "sideBar.background")]
141    pub side_bar_background: Option<String>,
142    #[serde(rename = "sideBarTitle.foreground")]
143    pub side_bar_title_foreground: Option<String>,
144    #[serde(rename = "sideBarSectionHeader.background")]
145    pub side_bar_section_header_background: Option<String>,
146    #[serde(rename = "sideBarSectionHeader.border")]
147    pub side_bar_section_header_border: Option<String>,
148    #[serde(rename = "editorGroup.border")]
149    pub editor_group_border: Option<String>,
150    #[serde(rename = "editorGroup.dropBackground")]
151    pub editor_group_drop_background: Option<String>,
152    #[serde(rename = "editorGroupHeader.tabsBackground")]
153    pub editor_group_header_tabs_background: Option<String>,
154    #[serde(rename = "tab.activeBackground")]
155    pub tab_active_background: Option<String>,
156    #[serde(rename = "tab.activeForeground")]
157    pub tab_active_foreground: Option<String>,
158    #[serde(rename = "tab.border")]
159    pub tab_border: Option<String>,
160    #[serde(rename = "tab.activeBorderTop")]
161    pub tab_active_border_top: Option<String>,
162    #[serde(rename = "tab.inactiveBackground")]
163    pub tab_inactive_background: Option<String>,
164    #[serde(rename = "tab.inactiveForeground")]
165    pub tab_inactive_foreground: Option<String>,
166    #[serde(rename = "editor.foreground")]
167    pub editor_foreground: Option<String>,
168    #[serde(rename = "editor.background")]
169    pub editor_background: Option<String>,
170    #[serde(rename = "editorLineNumber.foreground")]
171    pub editor_line_number_foreground: Option<String>,
172    #[serde(rename = "editor.selectionBackground")]
173    pub editor_selection_background: Option<String>,
174    #[serde(rename = "editor.selectionHighlightBackground")]
175    pub editor_selection_highlight_background: Option<String>,
176    #[serde(rename = "editor.foldBackground")]
177    pub editor_fold_background: Option<String>,
178    #[serde(rename = "editor.wordHighlightBackground")]
179    pub editor_word_highlight_background: Option<String>,
180    #[serde(rename = "editor.wordHighlightStrongBackground")]
181    pub editor_word_highlight_strong_background: Option<String>,
182    #[serde(rename = "editor.findMatchBackground")]
183    pub editor_find_match_background: Option<String>,
184    #[serde(rename = "editor.findMatchHighlightBackground")]
185    pub editor_find_match_highlight_background: Option<String>,
186    #[serde(rename = "editor.findRangeHighlightBackground")]
187    pub editor_find_range_highlight_background: Option<String>,
188    #[serde(rename = "editor.hoverHighlightBackground")]
189    pub editor_hover_highlight_background: Option<String>,
190    #[serde(rename = "editor.lineHighlightBorder")]
191    pub editor_line_highlight_border: Option<String>,
192    #[serde(rename = "editorLink.activeForeground")]
193    pub editor_link_active_foreground: Option<String>,
194    #[serde(rename = "editor.rangeHighlightBackground")]
195    pub editor_range_highlight_background: Option<String>,
196    #[serde(rename = "editor.snippetTabstopHighlightBackground")]
197    pub editor_snippet_tabstop_highlight_background: Option<String>,
198    #[serde(rename = "editor.snippetTabstopHighlightBorder")]
199    pub editor_snippet_tabstop_highlight_border: Option<String>,
200    #[serde(rename = "editor.snippetFinalTabstopHighlightBackground")]
201    pub editor_snippet_final_tabstop_highlight_background: Option<String>,
202    #[serde(rename = "editor.snippetFinalTabstopHighlightBorder")]
203    pub editor_snippet_final_tabstop_highlight_border: Option<String>,
204    #[serde(rename = "editorWhitespace.foreground")]
205    pub editor_whitespace_foreground: Option<String>,
206    #[serde(rename = "editorIndentGuide.background")]
207    pub editor_indent_guide_background: Option<String>,
208    #[serde(rename = "editorIndentGuide.activeBackground")]
209    pub editor_indent_guide_active_background: Option<String>,
210    #[serde(rename = "editorRuler.foreground")]
211    pub editor_ruler_foreground: Option<String>,
212    #[serde(rename = "editorCodeLens.foreground")]
213    pub editor_code_lens_foreground: Option<String>,
214    #[serde(rename = "editorBracketHighlight.foreground1")]
215    pub editor_bracket_highlight_foreground1: Option<String>,
216    #[serde(rename = "editorBracketHighlight.foreground2")]
217    pub editor_bracket_highlight_foreground2: Option<String>,
218    #[serde(rename = "editorBracketHighlight.foreground3")]
219    pub editor_bracket_highlight_foreground3: Option<String>,
220    #[serde(rename = "editorBracketHighlight.foreground4")]
221    pub editor_bracket_highlight_foreground4: Option<String>,
222    #[serde(rename = "editorBracketHighlight.foreground5")]
223    pub editor_bracket_highlight_foreground5: Option<String>,
224    #[serde(rename = "editorBracketHighlight.foreground6")]
225    pub editor_bracket_highlight_foreground6: Option<String>,
226    #[serde(rename = "editorBracketHighlight.unexpectedBracket.foreground")]
227    pub editor_bracket_highlight_unexpected_bracket_foreground: Option<String>,
228    #[serde(rename = "editorOverviewRuler.border")]
229    pub editor_overview_ruler_border: Option<String>,
230    #[serde(rename = "editorOverviewRuler.selectionHighlightForeground")]
231    pub editor_overview_ruler_selection_highlight_foreground: Option<String>,
232    #[serde(rename = "editorOverviewRuler.wordHighlightForeground")]
233    pub editor_overview_ruler_word_highlight_foreground: Option<String>,
234    #[serde(rename = "editorOverviewRuler.wordHighlightStrongForeground")]
235    pub editor_overview_ruler_word_highlight_strong_foreground: Option<String>,
236    #[serde(rename = "editorOverviewRuler.modifiedForeground")]
237    pub editor_overview_ruler_modified_foreground: Option<String>,
238    #[serde(rename = "editorOverviewRuler.addedForeground")]
239    pub editor_overview_ruler_added_foreground: Option<String>,
240    #[serde(rename = "editorOverviewRuler.deletedForeground")]
241    pub editor_overview_ruler_deleted_foreground: Option<String>,
242    #[serde(rename = "editorOverviewRuler.errorForeground")]
243    pub editor_overview_ruler_error_foreground: Option<String>,
244    #[serde(rename = "editorOverviewRuler.warningForeground")]
245    pub editor_overview_ruler_warning_foreground: Option<String>,
246    #[serde(rename = "editorOverviewRuler.infoForeground")]
247    pub editor_overview_ruler_info_foreground: Option<String>,
248    #[serde(rename = "editorError.foreground")]
249    pub editor_error_foreground: Option<String>,
250    #[serde(rename = "editorWarning.foreground")]
251    pub editor_warning_foreground: Option<String>,
252    #[serde(rename = "editorGutter.modifiedBackground")]
253    pub editor_gutter_modified_background: Option<String>,
254    #[serde(rename = "editorGutter.addedBackground")]
255    pub editor_gutter_added_background: Option<String>,
256    #[serde(rename = "editorGutter.deletedBackground")]
257    pub editor_gutter_deleted_background: Option<String>,
258    #[serde(rename = "gitDecoration.modifiedResourceForeground")]
259    pub git_decoration_modified_resource_foreground: Option<String>,
260    #[serde(rename = "gitDecoration.deletedResourceForeground")]
261    pub git_decoration_deleted_resource_foreground: Option<String>,
262    #[serde(rename = "gitDecoration.untrackedResourceForeground")]
263    pub git_decoration_untracked_resource_foreground: Option<String>,
264    #[serde(rename = "gitDecoration.ignoredResourceForeground")]
265    pub git_decoration_ignored_resource_foreground: Option<String>,
266    #[serde(rename = "gitDecoration.conflictingResourceForeground")]
267    pub git_decoration_conflicting_resource_foreground: Option<String>,
268    #[serde(rename = "diffEditor.insertedTextBackground")]
269    pub diff_editor_inserted_text_background: Option<String>,
270    #[serde(rename = "diffEditor.removedTextBackground")]
271    pub diff_editor_removed_text_background: Option<String>,
272    #[serde(rename = "inlineChat.regionHighlight")]
273    pub inline_chat_region_highlight: Option<String>,
274    #[serde(rename = "editorWidget.background")]
275    pub editor_widget_background: Option<String>,
276    #[serde(rename = "editorSuggestWidget.background")]
277    pub editor_suggest_widget_background: Option<String>,
278    #[serde(rename = "editorSuggestWidget.foreground")]
279    pub editor_suggest_widget_foreground: Option<String>,
280    #[serde(rename = "editorSuggestWidget.selectedBackground")]
281    pub editor_suggest_widget_selected_background: Option<String>,
282    #[serde(rename = "editorHoverWidget.background")]
283    pub editor_hover_widget_background: Option<String>,
284    #[serde(rename = "editorHoverWidget.border")]
285    pub editor_hover_widget_border: Option<String>,
286    #[serde(rename = "editorMarkerNavigation.background")]
287    pub editor_marker_navigation_background: Option<String>,
288    #[serde(rename = "peekView.border")]
289    pub peek_view_border: Option<String>,
290    #[serde(rename = "peekViewEditor.background")]
291    pub peek_view_editor_background: Option<String>,
292    #[serde(rename = "peekViewEditor.matchHighlightBackground")]
293    pub peek_view_editor_match_highlight_background: Option<String>,
294    #[serde(rename = "peekViewResult.background")]
295    pub peek_view_result_background: Option<String>,
296    #[serde(rename = "peekViewResult.fileForeground")]
297    pub peek_view_result_file_foreground: Option<String>,
298    #[serde(rename = "peekViewResult.lineForeground")]
299    pub peek_view_result_line_foreground: Option<String>,
300    #[serde(rename = "peekViewResult.matchHighlightBackground")]
301    pub peek_view_result_match_highlight_background: Option<String>,
302    #[serde(rename = "peekViewResult.selectionBackground")]
303    pub peek_view_result_selection_background: Option<String>,
304    #[serde(rename = "peekViewResult.selectionForeground")]
305    pub peek_view_result_selection_foreground: Option<String>,
306    #[serde(rename = "peekViewTitle.background")]
307    pub peek_view_title_background: Option<String>,
308    #[serde(rename = "peekViewTitleDescription.foreground")]
309    pub peek_view_title_description_foreground: Option<String>,
310    #[serde(rename = "peekViewTitleLabel.foreground")]
311    pub peek_view_title_label_foreground: Option<String>,
312    #[serde(rename = "merge.currentHeaderBackground")]
313    pub merge_current_header_background: Option<String>,
314    #[serde(rename = "merge.incomingHeaderBackground")]
315    pub merge_incoming_header_background: Option<String>,
316    #[serde(rename = "editorOverviewRuler.currentContentForeground")]
317    pub editor_overview_ruler_current_content_foreground: Option<String>,
318    #[serde(rename = "editorOverviewRuler.incomingContentForeground")]
319    pub editor_overview_ruler_incoming_content_foreground: Option<String>,
320    #[serde(rename = "panel.background")]
321    pub panel_background: Option<String>,
322    #[serde(rename = "panel.border")]
323    pub panel_border: Option<String>,
324    #[serde(rename = "panelTitle.activeBorder")]
325    pub panel_title_active_border: Option<String>,
326    #[serde(rename = "panelTitle.activeForeground")]
327    pub panel_title_active_foreground: Option<String>,
328    #[serde(rename = "panelTitle.inactiveForeground")]
329    pub panel_title_inactive_foreground: Option<String>,
330    #[serde(rename = "statusBar.background")]
331    pub status_bar_background: Option<String>,
332    #[serde(rename = "statusBar.foreground")]
333    pub status_bar_foreground: Option<String>,
334    #[serde(rename = "statusBar.debuggingBackground")]
335    pub status_bar_debugging_background: Option<String>,
336    #[serde(rename = "statusBar.debuggingForeground")]
337    pub status_bar_debugging_foreground: Option<String>,
338    #[serde(rename = "statusBar.noFolderBackground")]
339    pub status_bar_no_folder_background: Option<String>,
340    #[serde(rename = "statusBar.noFolderForeground")]
341    pub status_bar_no_folder_foreground: Option<String>,
342    #[serde(rename = "statusBarItem.prominentBackground")]
343    pub status_bar_item_prominent_background: Option<String>,
344    #[serde(rename = "statusBarItem.prominentHoverBackground")]
345    pub status_bar_item_prominent_hover_background: Option<String>,
346    #[serde(rename = "statusBarItem.remoteForeground")]
347    pub status_bar_item_remote_foreground: Option<String>,
348    #[serde(rename = "statusBarItem.remoteBackground")]
349    pub status_bar_item_remote_background: Option<String>,
350    #[serde(rename = "titleBar.activeBackground")]
351    pub title_bar_active_background: Option<String>,
352    #[serde(rename = "titleBar.activeForeground")]
353    pub title_bar_active_foreground: Option<String>,
354    #[serde(rename = "titleBar.inactiveBackground")]
355    pub title_bar_inactive_background: Option<String>,
356    #[serde(rename = "titleBar.inactiveForeground")]
357    pub title_bar_inactive_foreground: Option<String>,
358    #[serde(rename = "extensionButton.prominentForeground")]
359    pub extension_button_prominent_foreground: Option<String>,
360    #[serde(rename = "extensionButton.prominentBackground")]
361    pub extension_button_prominent_background: Option<String>,
362    #[serde(rename = "extensionButton.prominentHoverBackground")]
363    pub extension_button_prominent_hover_background: Option<String>,
364    #[serde(rename = "pickerGroup.border")]
365    pub picker_group_border: Option<String>,
366    #[serde(rename = "pickerGroup.foreground")]
367    pub picker_group_foreground: Option<String>,
368    #[serde(rename = "debugToolBar.background")]
369    pub debug_tool_bar_background: Option<String>,
370    #[serde(rename = "walkThrough.embeddedEditorBackground")]
371    pub walk_through_embedded_editor_background: Option<String>,
372    #[serde(rename = "settings.headerForeground")]
373    pub settings_header_foreground: Option<String>,
374    #[serde(rename = "settings.modifiedItemIndicator")]
375    pub settings_modified_item_indicator: Option<String>,
376    #[serde(rename = "settings.dropdownBackground")]
377    pub settings_dropdown_background: Option<String>,
378    #[serde(rename = "settings.dropdownForeground")]
379    pub settings_dropdown_foreground: Option<String>,
380    #[serde(rename = "settings.dropdownBorder")]
381    pub settings_dropdown_border: Option<String>,
382    #[serde(rename = "settings.checkboxBackground")]
383    pub settings_checkbox_background: Option<String>,
384    #[serde(rename = "settings.checkboxForeground")]
385    pub settings_checkbox_foreground: Option<String>,
386    #[serde(rename = "settings.checkboxBorder")]
387    pub settings_checkbox_border: Option<String>,
388    #[serde(rename = "settings.textInputBackground")]
389    pub settings_text_input_background: Option<String>,
390    #[serde(rename = "settings.textInputForeground")]
391    pub settings_text_input_foreground: Option<String>,
392    #[serde(rename = "settings.textInputBorder")]
393    pub settings_text_input_border: Option<String>,
394    #[serde(rename = "settings.numberInputBackground")]
395    pub settings_number_input_background: Option<String>,
396    #[serde(rename = "settings.numberInputForeground")]
397    pub settings_number_input_foreground: Option<String>,
398    #[serde(rename = "settings.numberInputBorder")]
399    pub settings_number_input_border: Option<String>,
400    #[serde(rename = "breadcrumb.foreground")]
401    pub breadcrumb_foreground: Option<String>,
402    #[serde(rename = "breadcrumb.background")]
403    pub breadcrumb_background: Option<String>,
404    #[serde(rename = "breadcrumb.focusForeground")]
405    pub breadcrumb_focus_foreground: Option<String>,
406    #[serde(rename = "breadcrumb.activeSelectionForeground")]
407    pub breadcrumb_active_selection_foreground: Option<String>,
408    #[serde(rename = "breadcrumbPicker.background")]
409    pub breadcrumb_picker_background: Option<String>,
410    #[serde(rename = "listFilterWidget.background")]
411    pub list_filter_widget_background: Option<String>,
412    #[serde(rename = "listFilterWidget.outline")]
413    pub list_filter_widget_outline: Option<String>,
414    #[serde(rename = "listFilterWidget.noMatchesOutline")]
415    pub list_filter_widget_no_matches_outline: Option<String>,
416}
417
418fn try_parse_color(color: &str) -> Result<Hsla> {
419    Ok(Rgba::try_from(color)?.into())
420}
421
422pub struct VsCodeThemeConverter {
423    theme: VsCodeTheme,
424    theme_metadata: ThemeMetadata,
425}
426
427impl VsCodeThemeConverter {
428    pub fn new(theme: VsCodeTheme, theme_metadata: ThemeMetadata) -> Self {
429        Self {
430            theme,
431            theme_metadata,
432        }
433    }
434
435    pub fn convert(self) -> Result<ThemeVariant> {
436        let appearance = self.theme_metadata.appearance.into();
437
438        let mut theme_colors = match appearance {
439            Appearance::Light => ThemeColors::default_light(),
440            Appearance::Dark => ThemeColors::default_dark(),
441        };
442
443        let vscode_colors = &self.theme.colors;
444
445        let theme_colors_refinements = ThemeColorsRefinement {
446            border: Some(try_parse_color(&vscode_colors.panel_border)?),
447            border_variant: Some(try_parse_color(&vscode_colors.panel_border)?),
448            border_focused: Some(try_parse_color(&vscode_colors.panel_border)?),
449            border_transparent: Some(try_parse_color(&vscode_colors.panel_border)?),
450            elevated_surface_background: Some(try_parse_color(&vscode_colors.panel_background)?),
451            surface_background: Some(try_parse_color(&vscode_colors.panel_background)?),
452            background: Some(try_parse_color(&vscode_colors.editor_background)?),
453            element_background: Some(try_parse_color(&vscode_colors.button_background)?),
454            text: Some(try_parse_color(&vscode_colors.foreground)?),
455            tab_active_background: Some(try_parse_color(&vscode_colors.tab_active_background)?),
456            tab_inactive_background: Some(try_parse_color(&vscode_colors.tab_inactive_background)?),
457            terminal_background: Some(try_parse_color(&vscode_colors.terminal_background)?),
458            terminal_ansi_bright_black: Some(try_parse_color(
459                &vscode_colors.terminal_ansi_bright_black,
460            )?),
461            terminal_ansi_bright_red: Some(try_parse_color(
462                &vscode_colors.terminal_ansi_bright_red,
463            )?),
464            terminal_ansi_bright_green: Some(try_parse_color(
465                &vscode_colors.terminal_ansi_bright_green,
466            )?),
467            terminal_ansi_bright_yellow: Some(try_parse_color(
468                &vscode_colors.terminal_ansi_bright_yellow,
469            )?),
470            terminal_ansi_bright_blue: Some(try_parse_color(
471                &vscode_colors.terminal_ansi_bright_blue,
472            )?),
473            terminal_ansi_bright_magenta: Some(try_parse_color(
474                &vscode_colors.terminal_ansi_bright_magenta,
475            )?),
476            terminal_ansi_bright_cyan: Some(try_parse_color(
477                &vscode_colors.terminal_ansi_bright_cyan,
478            )?),
479            terminal_ansi_bright_white: Some(try_parse_color(
480                &vscode_colors.terminal_ansi_bright_white,
481            )?),
482            terminal_ansi_black: Some(try_parse_color(&vscode_colors.terminal_ansi_black)?),
483            terminal_ansi_red: Some(try_parse_color(&vscode_colors.terminal_ansi_red)?),
484            terminal_ansi_green: Some(try_parse_color(&vscode_colors.terminal_ansi_green)?),
485            terminal_ansi_yellow: Some(try_parse_color(&vscode_colors.terminal_ansi_yellow)?),
486            terminal_ansi_blue: Some(try_parse_color(&vscode_colors.terminal_ansi_blue)?),
487            terminal_ansi_magenta: Some(try_parse_color(&vscode_colors.terminal_ansi_magenta)?),
488            terminal_ansi_cyan: Some(try_parse_color(&vscode_colors.terminal_ansi_cyan)?),
489            terminal_ansi_white: Some(try_parse_color(&vscode_colors.terminal_ansi_white)?),
490            ..Default::default()
491        };
492
493        theme_colors.refine(&theme_colors_refinements);
494
495        Ok(ThemeVariant {
496            id: uuid::Uuid::new_v4().to_string(),
497            name: self.theme_metadata.name.into(),
498            appearance,
499            styles: ThemeStyles {
500                system: SystemColors::default(),
501                colors: theme_colors,
502                status: StatusColors::default(),
503                git: GitStatusColors::default(),
504                player: PlayerColors::default(),
505                syntax: SyntaxTheme::default_dark(),
506            },
507        })
508    }
509}
510
511// #[cfg(test)]
512// mod tests {
513//     use super::*;
514//     use std::path::PathBuf;
515
516//     #[test]
517//     fn test_deserialize_theme() {
518//         let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
519//         let root_dir = manifest_dir.parent().unwrap().parent().unwrap();
520
521//         let mut d = root_dir.to_path_buf();
522//         d.push("assets/themes/src/vsc/dracula/dracula.json");
523
524//         let data = std::fs::read_to_string(d).expect("Unable to read file");
525
526//         let result: Theme = serde_json::from_str(&data).unwrap();
527//         println!("{:#?}", result);
528//     }
529// }