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}