1use std::{fmt, marker::PhantomData};
2
3#[rustfmt::skip]
4
5use serde::{de, Deserialize, Deserializer, Serialize};
6
7#[allow(dead_code)]
8#[derive(Serialize, Deserialize, Debug)]
9pub struct Colors {
10 #[serde(rename = "focusBorder")]
11 pub focus_border: String,
12 #[serde(rename = "foreground")]
13 pub foreground: String,
14 #[serde(rename = "selection.background")]
15 pub selection_background: String,
16 #[serde(rename = "widget.shadow")]
17 pub widget_shadow: String,
18 #[serde(rename = "textLink.activeForeground")]
19 pub text_link_active_foreground: String,
20 #[serde(rename = "textLink.foreground")]
21 pub text_link_foreground: String,
22 #[serde(rename = "textPreformat.foreground")]
23 pub text_preformat_foreground: String,
24 #[serde(rename = "button.background")]
25 pub button_background: String,
26 #[serde(rename = "button.foreground")]
27 pub button_foreground: String,
28 #[serde(rename = "button.hoverBackground")]
29 pub button_hover_background: String,
30 #[serde(rename = "dropdown.background")]
31 pub dropdown_background: String,
32 #[serde(rename = "dropdown.listBackground")]
33 pub dropdown_list_background: String,
34 #[serde(rename = "input.background")]
35 pub input_background: String,
36 #[serde(rename = "input.border")]
37 pub input_border: String,
38 #[serde(rename = "input.foreground")]
39 pub input_foreground: String,
40 #[serde(rename = "input.placeholderForeground")]
41 pub input_placeholder_foreground: String,
42 #[serde(rename = "scrollbar.shadow")]
43 pub scrollbar_shadow: String,
44 #[serde(rename = "scrollbarSlider.activeBackground")]
45 pub scrollbar_slider_active_background: String,
46 #[serde(rename = "scrollbarSlider.background")]
47 pub scrollbar_slider_background: String,
48 #[serde(rename = "scrollbarSlider.hoverBackground")]
49 pub scrollbar_slider_hover_background: String,
50 #[serde(rename = "badge.foreground")]
51 pub badge_foreground: String,
52 #[serde(rename = "badge.background")]
53 pub badge_background: String,
54 #[serde(rename = "progressBar.background")]
55 pub progress_bar_background: String,
56 #[serde(rename = "list.activeSelectionBackground")]
57 pub list_active_selection_background: String,
58 #[serde(rename = "list.activeSelectionForeground")]
59 pub list_active_selection_foreground: String,
60 #[serde(rename = "list.inactiveSelectionBackground")]
61 pub list_inactive_selection_background: String,
62 #[serde(rename = "list.inactiveSelectionForeground")]
63 pub list_inactive_selection_foreground: String,
64 #[serde(rename = "list.hoverForeground")]
65 pub list_hover_foreground: String,
66 #[serde(rename = "list.focusForeground")]
67 pub list_focus_foreground: String,
68 #[serde(rename = "list.focusBackground")]
69 pub list_focus_background: String,
70 #[serde(rename = "list.hoverBackground")]
71 pub list_hover_background: String,
72 #[serde(rename = "list.dropBackground")]
73 pub list_drop_background: String,
74 #[serde(rename = "list.highlightForeground")]
75 pub list_highlight_foreground: String,
76 #[serde(rename = "list.errorForeground")]
77 pub list_error_foreground: String,
78 #[serde(rename = "list.warningForeground")]
79 pub list_warning_foreground: String,
80 #[serde(rename = "activityBar.background")]
81 pub activity_bar_background: String,
82 #[serde(rename = "activityBar.dropBackground")]
83 pub activity_bar_drop_background: String,
84 #[serde(rename = "activityBar.foreground")]
85 pub activity_bar_foreground: String,
86 #[serde(rename = "activityBarBadge.background")]
87 pub activity_bar_badge_background: String,
88 #[serde(rename = "activityBarBadge.foreground")]
89 pub activity_bar_badge_foreground: String,
90 #[serde(rename = "sideBar.background")]
91 pub side_bar_background: String,
92 #[serde(rename = "sideBar.foreground")]
93 pub side_bar_foreground: String,
94 #[serde(rename = "sideBarSectionHeader.background")]
95 pub side_bar_section_header_background: String,
96 #[serde(rename = "sideBarSectionHeader.foreground")]
97 pub side_bar_section_header_foreground: String,
98 #[serde(rename = "sideBarTitle.foreground")]
99 pub side_bar_title_foreground: String,
100 #[serde(rename = "editorGroup.border")]
101 pub editor_group_border: String,
102 #[serde(rename = "editorGroup.dropBackground")]
103 pub editor_group_drop_background: String,
104 #[serde(rename = "editorGroupHeader.noTabsBackground")]
105 pub editor_group_header_no_tabs_background: String,
106 #[serde(rename = "editorGroupHeader.tabsBackground")]
107 pub editor_group_header_tabs_background: String,
108 #[serde(rename = "tab.activeBackground")]
109 pub tab_active_background: String,
110 #[serde(rename = "tab.activeForeground")]
111 pub tab_active_foreground: String,
112 #[serde(rename = "tab.border")]
113 pub tab_border: String,
114 #[serde(rename = "tab.activeBorder")]
115 pub tab_active_border: String,
116 #[serde(rename = "tab.unfocusedActiveBorder")]
117 pub tab_unfocused_active_border: String,
118 #[serde(rename = "tab.inactiveBackground")]
119 pub tab_inactive_background: String,
120 #[serde(rename = "tab.inactiveForeground")]
121 pub tab_inactive_foreground: String,
122 #[serde(rename = "tab.unfocusedActiveForeground")]
123 pub tab_unfocused_active_foreground: String,
124 #[serde(rename = "tab.unfocusedInactiveForeground")]
125 pub tab_unfocused_inactive_foreground: String,
126 #[serde(rename = "editor.background")]
127 pub editor_background: String,
128 #[serde(rename = "editor.foreground")]
129 pub editor_foreground: String,
130 #[serde(rename = "editor.hoverHighlightBackground")]
131 pub editor_hover_highlight_background: String,
132 #[serde(rename = "editor.findMatchBackground")]
133 pub editor_find_match_background: String,
134 #[serde(rename = "editor.findMatchHighlightBackground")]
135 pub editor_find_match_highlight_background: String,
136 #[serde(rename = "editor.findRangeHighlightBackground")]
137 pub editor_find_range_highlight_background: String,
138 #[serde(rename = "editor.lineHighlightBackground")]
139 pub editor_line_highlight_background: String,
140 #[serde(rename = "editor.lineHighlightBorder")]
141 pub editor_line_highlight_border: String,
142 #[serde(rename = "editor.inactiveSelectionBackground")]
143 pub editor_inactive_selection_background: String,
144 #[serde(rename = "editor.selectionBackground")]
145 pub editor_selection_background: String,
146 #[serde(rename = "editor.selectionHighlightBackground")]
147 pub editor_selection_highlight_background: String,
148 #[serde(rename = "editor.rangeHighlightBackground")]
149 pub editor_range_highlight_background: String,
150 #[serde(rename = "editor.wordHighlightBackground")]
151 pub editor_word_highlight_background: String,
152 #[serde(rename = "editor.wordHighlightStrongBackground")]
153 pub editor_word_highlight_strong_background: String,
154 #[serde(rename = "editorError.foreground")]
155 pub editor_error_foreground: String,
156 #[serde(rename = "editorError.border")]
157 pub editor_error_border: String,
158 #[serde(rename = "editorWarning.foreground")]
159 pub editor_warning_foreground: String,
160 #[serde(rename = "editorInfo.foreground")]
161 pub editor_info_foreground: String,
162 #[serde(rename = "editorWarning.border")]
163 pub editor_warning_border: String,
164 #[serde(rename = "editorCursor.foreground")]
165 pub editor_cursor_foreground: String,
166 #[serde(rename = "editorIndentGuide.background")]
167 pub editor_indent_guide_background: String,
168 #[serde(rename = "editorLineNumber.foreground")]
169 pub editor_line_number_foreground: String,
170 #[serde(rename = "editorWhitespace.foreground")]
171 pub editor_whitespace_foreground: String,
172 #[serde(rename = "editorOverviewRuler.border")]
173 pub editor_overview_ruler_border: String,
174 #[serde(rename = "editorOverviewRuler.currentContentForeground")]
175 pub editor_overview_ruler_current_content_foreground: String,
176 #[serde(rename = "editorOverviewRuler.incomingContentForeground")]
177 pub editor_overview_ruler_incoming_content_foreground: String,
178 #[serde(rename = "editorOverviewRuler.findMatchForeground")]
179 pub editor_overview_ruler_find_match_foreground: String,
180 #[serde(rename = "editorOverviewRuler.rangeHighlightForeground")]
181 pub editor_overview_ruler_range_highlight_foreground: String,
182 #[serde(rename = "editorOverviewRuler.selectionHighlightForeground")]
183 pub editor_overview_ruler_selection_highlight_foreground: String,
184 #[serde(rename = "editorOverviewRuler.wordHighlightForeground")]
185 pub editor_overview_ruler_word_highlight_foreground: String,
186 #[serde(rename = "editorOverviewRuler.wordHighlightStrongForeground")]
187 pub editor_overview_ruler_word_highlight_strong_foreground: String,
188 #[serde(rename = "editorOverviewRuler.modifiedForeground")]
189 pub editor_overview_ruler_modified_foregrund: String,
190 #[serde(rename = "editorOverviewRuler.addedForeground")]
191 pub editor_overview_ruler_added_foreground: String,
192 #[serde(rename = "editorOverviewRuler.deletedForeground")]
193 pub editor_overview_ruler_deleted_foreground: String,
194 #[serde(rename = "editorOverviewRuler.errorForeground")]
195 pub editor_overview_ruler_error_foreground: String,
196 #[serde(rename = "editorOverviewRuler.warningForeground")]
197 pub editor_overview_ruler_warning_foreground: String,
198 #[serde(rename = "editorOverviewRuler.infoForeground")]
199 pub editor_overview_ruler_info_foreground: String,
200 #[serde(rename = "editorOverviewRuler.bracketMatchForeground")]
201 pub editor_overview_ruler_bracket_match_foreground: String,
202 #[serde(rename = "editorGutter.modifiedBackground")]
203 pub editor_gutter_modified_background: String,
204 #[serde(rename = "editorGutter.addedBackground")]
205 pub editor_gutter_added_background: String,
206 #[serde(rename = "editorGutter.deletedBackground")]
207 pub editor_gutter_deleted_background: String,
208 #[serde(rename = "diffEditor.insertedTextBackground")]
209 pub diff_editor_inserted_text_background: String,
210 #[serde(rename = "diffEditor.removedTextBackground")]
211 pub diff_editor_removed_text_background: String,
212 #[serde(rename = "editorWidget.background")]
213 pub editor_widget_background: String,
214 #[serde(rename = "editorWidget.border")]
215 pub editor_widget_border: String,
216 #[serde(rename = "editorSuggestWidget.background")]
217 pub editor_suggest_widget_background: String,
218 #[serde(rename = "peekView.border")]
219 pub peek_view_border: String,
220 #[serde(rename = "peekViewEditor.matchHighlightBackground")]
221 pub peek_view_editor_match_highlight_background: String,
222 #[serde(rename = "peekViewEditorGutter.background")]
223 pub peek_view_editor_gutter_background: String,
224 #[serde(rename = "peekViewEditor.background")]
225 pub peek_view_editor_background: String,
226 #[serde(rename = "peekViewResult.background")]
227 pub peek_view_result_background: String,
228 #[serde(rename = "peekViewTitle.background")]
229 pub peek_view_title_background: String,
230 #[serde(rename = "merge.currentHeaderBackground")]
231 pub merge_current_header_background: String,
232 #[serde(rename = "merge.currentContentBackground")]
233 pub merge_current_content_background: String,
234 #[serde(rename = "merge.incomingHeaderBackground")]
235 pub merge_incoming_header_background: String,
236 #[serde(rename = "merge.incomingContentBackground")]
237 pub merge_incoming_content_background: String,
238 #[serde(rename = "panel.background")]
239 pub panel_background: String,
240 #[serde(rename = "panel.border")]
241 pub panel_border: String,
242 #[serde(rename = "panelTitle.activeBorder")]
243 pub panel_title_active_border: String,
244 #[serde(rename = "statusBar.background")]
245 pub status_bar_background: String,
246 #[serde(rename = "statusBar.debuggingBackground")]
247 pub status_bar_debugging_background: String,
248 #[serde(rename = "statusBar.debuggingForeground")]
249 pub status_bar_debugging_foreground: String,
250 #[serde(rename = "statusBar.noFolderForeground")]
251 pub status_bar_no_folder_foreground: String,
252 #[serde(rename = "statusBar.noFolderBackground")]
253 pub status_bar_no_folder_background: String,
254 #[serde(rename = "statusBar.foreground")]
255 pub status_bar_foreground: String,
256 #[serde(rename = "statusBarItem.activeBackground")]
257 pub status_bar_item_active_background: String,
258 #[serde(rename = "statusBarItem.hoverBackground")]
259 pub status_bar_item_hover_background: String,
260 #[serde(rename = "statusBarItem.prominentBackground")]
261 pub status_bar_item_prominent_background: String,
262 #[serde(rename = "statusBarItem.prominentHoverBackground")]
263 pub status_bar_item_prominent_hover_background: String,
264 #[serde(rename = "statusBar.border")]
265 pub status_bar_border: String,
266 #[serde(rename = "titleBar.activeBackground")]
267 pub title_bar_active_background: String,
268 #[serde(rename = "titleBar.activeForeground")]
269 pub title_bar_active_foreground: String,
270 #[serde(rename = "titleBar.inactiveBackground")]
271 pub title_bar_inactive_background: String,
272 #[serde(rename = "titleBar.inactiveForeground")]
273 pub title_bar_inactive_foreground: String,
274 #[serde(rename = "notificationCenterHeader.foreground")]
275 pub notification_center_header_foreground: String,
276 #[serde(rename = "notificationCenterHeader.background")]
277 pub notification_center_header_background: String,
278 #[serde(rename = "extensionButton.prominentForeground")]
279 pub extension_button_prominent_foreground: String,
280 #[serde(rename = "extensionButton.prominentBackground")]
281 pub extension_button_prominent_background: String,
282 #[serde(rename = "extensionButton.prominentHoverBackground")]
283 pub extension_button_prominent_hover_background: String,
284 #[serde(rename = "pickerGroup.border")]
285 pub picker_group_border: String,
286 #[serde(rename = "pickerGroup.foreground")]
287 pub picker_group_foreground: String,
288 #[serde(rename = "terminal.ansiBrightBlack")]
289 pub terminal_ansi_bright_black: String,
290 #[serde(rename = "terminal.ansiBlack")]
291 pub terminal_ansi_black: String,
292 #[serde(rename = "terminal.ansiBlue")]
293 pub terminal_ansi_blue: String,
294 #[serde(rename = "terminal.ansiBrightBlue")]
295 pub terminal_ansi_bright_blue: String,
296 #[serde(rename = "terminal.ansiBrightCyan")]
297 pub terminal_ansi_bright_cyan: String,
298 #[serde(rename = "terminal.ansiCyan")]
299 pub terminal_ansi_cyan: String,
300 #[serde(rename = "terminal.ansiBrightMagenta")]
301 pub terminal_ansi_bright_magenta: String,
302 #[serde(rename = "terminal.ansiMagenta")]
303 pub terminal_ansi_magenta: String,
304 #[serde(rename = "terminal.ansiBrightRed")]
305 pub terminal_ansi_bright_red: String,
306 #[serde(rename = "terminal.ansiRed")]
307 pub terminal_ansi_red: String,
308 #[serde(rename = "terminal.ansiYellow")]
309 pub terminal_ansi_yellow: String,
310 #[serde(rename = "terminal.ansiBrightYellow")]
311 pub terminal_ansi_bright_yellow: String,
312 #[serde(rename = "terminal.ansiBrightGreen")]
313 pub terminal_ansi_bright_green: String,
314 #[serde(rename = "terminal.ansiGreen")]
315 pub terminal_ansi_green: String,
316 #[serde(rename = "terminal.ansiWhite")]
317 pub terminal_ansi_white: String,
318 #[serde(rename = "terminal.selectionBackground")]
319 pub terminal_selection_background: String,
320 #[serde(rename = "terminalCursor.background")]
321 pub terminal_cursor_background: String,
322 #[serde(rename = "terminalCursor.foreground")]
323 pub terminal_cursor_foreground: String,
324 #[serde(rename = "gitDecoration.modifiedResourceForeground")]
325 pub git_decoration_modified_resource_foreground: String,
326 #[serde(rename = "gitDecoration.deletedResourceForeground")]
327 pub git_decoration_deleted_resource_foreground: String,
328 #[serde(rename = "gitDecoration.untrackedResourceForeground")]
329 pub git_decoration_untracked_resource_foreground: String,
330 #[serde(rename = "gitDecoration.conflictingResourceForeground")]
331 pub git_decoration_conflicting_resource_foreground: String,
332 #[serde(rename = "gitDecoration.submoduleResourceForeground")]
333 pub git_decoration_submodule_resource_foreground: String,
334}
335
336#[derive(Serialize, Deserialize, Debug)]
337pub struct TokenSetting {
338 pub foreground: Option<String>,
339 #[serde(rename = "fontStyle")]
340 pub font_style: Option<String>,
341}
342#[derive(Serialize, Deserialize, Debug)]
343pub struct TokenColors {
344 pub name: Option<String>,
345 #[serde(deserialize_with = "string_or_seq_string")]
346 pub scope: Vec<String>,
347 pub settings: TokenSetting,
348}
349
350#[derive(Serialize, Deserialize, Debug)]
351pub struct VSCodeTheme {
352 pub name: String,
353 #[serde(rename = "type")]
354 pub theme_type: String,
355 pub colors: Colors,
356 #[serde(rename = "tokenColors")]
357 pub token_colors: Vec<TokenColors>,
358}
359
360
361impl Default for VSCodeTheme {
362 fn default() -> Self {
363 let s = include_str!("themes/mariana.json");
364 serde_json::from_str(&s).unwrap()
365 }
366}
367
368fn string_or_seq_string<'de, D>(deserializer: D) -> Result<Vec<String>, D::Error>
369where
370 D: Deserializer<'de>,
371{
372 struct StringOrVec(PhantomData<Vec<String>>);
373
374 impl<'de> de::Visitor<'de> for StringOrVec {
375 type Value = Vec<String>;
376
377 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
378 formatter.write_str("string or list of strings")
379 }
380
381 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
382 where
383 E: de::Error,
384 {
385 Ok(vec![value.to_owned()])
386 }
387
388 fn visit_seq<S>(self, visitor: S) -> Result<Self::Value, S::Error>
389 where
390 S: de::SeqAccess<'de>,
391 {
392 Deserialize::deserialize(de::value::SeqAccessDeserializer::new(visitor))
393 }
394 }
395
396 deserializer.deserialize_any(StringOrVec(PhantomData))
397}