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}