vscode.rs

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