vscode.rs

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