1#![allow(non_snake_case, non_camel_case_types)]
35
36#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
42pub enum ChannelPriority {
43 High,
44
45 Normal,
46
47 Low,
48}
49
50macro_rules! DefineChannels {
51
52 ($($Variant:ident => $Wire:literal,)* $(,)?) => {
53
54 #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
56 pub enum Channel {
57
58 $($Variant,)*
59 }
60
61 impl Channel {
62
63 pub fn AsStr(&self) -> &'static str {
65
66 match self {
67
68 $(Self::$Variant => $Wire,)*
69 }
70 }
71
72 pub fn All() -> &'static [Self] {
74
75 &[$(Self::$Variant,)*]
76 }
77 }
78
79 impl ::std::fmt::Display for Channel {
80
81 fn fmt(&self, Formatter:&mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
82
83 Formatter.write_str(self.AsStr())
84 }
85 }
86
87 impl ::std::str::FromStr for Channel {
88
89 type Err = ::std::string::String;
90
91 fn from_str(Wire:&str) -> ::std::result::Result<Self, Self::Err> {
92
93 match Wire {
94
95 $($Wire => Ok(Self::$Variant),)*
96 _ => Err(format!("unknown IPC channel: {}", Wire)),
97 }
98 }
99 }
100 };
101}
102
103DefineChannels! {
104
105 CocoonExtensionHostMessage => "cocoon:extensionHostMessage",
107
108 CommandsExecute => "commands:execute",
110
111 CommandsGetAll => "commands:getAll",
112
113 ConfigurationGet => "configuration:get",
115
116 ConfigurationUpdate => "configuration:update",
117
118 DecorationsClear => "decorations:clear",
120
121 DecorationsGet => "decorations:get",
122
123 DecorationsGetMany => "decorations:getMany",
124
125 DecorationsSet => "decorations:set",
126
127 DiagnosticLog => "diagnostic:log",
129
130 EncryptionDecrypt => "encryption:decrypt",
132
133 EncryptionEncrypt => "encryption:encrypt",
134
135 EnvironmentGet => "environment:get",
137
138 ExtensionHostDebugServiceAttachSession => "extensionhostdebugservice:attachSession",
140
141 ExtensionHostDebugServiceClose => "extensionhostdebugservice:close",
142
143 ExtensionHostDebugServiceReload => "extensionhostdebugservice:reload",
144
145 ExtensionHostDebugServiceTerminateSession => "extensionhostdebugservice:terminateSession",
146
147 ExtensionsGet => "extensions:get",
149
150 ExtensionsGetAll => "extensions:getAll",
151
152 ExtensionsGetExtensions => "extensions:getExtensions",
153
154 ExtensionsGetExtensionsControlManifest => "extensions:getExtensionsControlManifest",
155
156 ExtensionsGetInstalled => "extensions:getInstalled",
157
158 ExtensionsGetRecommendations => "extensions:getRecommendations",
159
160 ExtensionsGetUninstalled => "extensions:getUninstalled",
161
162 ExtensionsInstall => "extensions:install",
163
164 ExtensionsIsActive => "extensions:isActive",
165
166 ExtensionsQuery => "extensions:query",
167
168 ExtensionsReinstall => "extensions:reinstall",
169
170 ExtensionsScanSystemExtensions => "extensions:scanSystemExtensions",
171
172 ExtensionsScanUserExtensions => "extensions:scanUserExtensions",
173
174 ExtensionsUninstall => "extensions:uninstall",
175
176 ExtensionsUpdateMetadata => "extensions:updateMetadata",
177
178 FileCloneFile => "file:cloneFile",
180
181 FileClose => "file:close",
182
183 FileCopy => "file:copy",
184
185 FileDelete => "file:delete",
186
187 FileExists => "file:exists",
188
189 FileMkdir => "file:mkdir",
190
191 FileMove => "file:move",
192
193 FileOpen => "file:open",
194
195 FileRead => "file:read",
196
197 FileReadBinary => "file:readBinary",
198
199 FileReaddir => "file:readdir",
200
201 FileReadFile => "file:readFile",
202
203 FileRealpath => "file:realpath",
204
205 FileRename => "file:rename",
206
207 FileStat => "file:stat",
208
209 FileUnwatch => "file:unwatch",
210
211 FileWatch => "file:watch",
212
213 FileWrite => "file:write",
214
215 FileWriteBinary => "file:writeBinary",
216
217 FileWriteFile => "file:writeFile",
218
219 GitCancel => "git:cancel",
224
225 GitCheckout => "git:checkout",
226
227 GitClone => "git:clone",
228
229 GitExec => "git:exec",
230
231 GitFetch => "git:fetch",
232
233 GitIsAvailable => "git:isAvailable",
234
235 GitPull => "git:pull",
236
237 GitRevListCount => "git:revListCount",
238
239 GitRevParse => "git:revParse",
240
241 HistoryCanGoBack => "history:canGoBack",
243
244 HistoryCanGoForward => "history:canGoForward",
245
246 HistoryClear => "history:clear",
247
248 HistoryGetStack => "history:getStack",
249
250 HistoryGoBack => "history:goBack",
251
252 HistoryGoForward => "history:goForward",
253
254 HistoryPush => "history:push",
255
256 KeybindingAdd => "keybinding:add",
258
259 KeybindingGetAll => "keybinding:getAll",
260
261 KeybindingLookup => "keybinding:lookup",
262
263 KeybindingRemove => "keybinding:remove",
264
265 LabelGetBase => "label:getBase",
267
268 LabelGetURI => "label:getUri",
269
270 LabelGetWorkspace => "label:getWorkspace",
271
272 LifecycleAdvancePhase => "lifecycle:advancePhase",
274
275 LifecycleGetPhase => "lifecycle:getPhase",
276
277 LifecycleRequestShutdown => "lifecycle:requestShutdown",
278
279 LifecycleSetPhase => "lifecycle:setPhase",
280
281 LifecycleWhenPhase => "lifecycle:whenPhase",
282
283 LogCreateLogger => "log:createLogger",
285
286 LogRegisterLogger => "log:registerLogger",
287
288 LoggerCreateLogger => "logger:createLogger",
290
291 LoggerCritical => "logger:critical",
292
293 LoggerDebug => "logger:debug",
294
295 LoggerDeregisterLogger => "logger:deregisterLogger",
296
297 LoggerError => "logger:error",
298
299 LoggerFlush => "logger:flush",
300
301 LoggerGetLevel => "logger:getLevel",
302
303 LoggerGetRegisteredLoggers => "logger:getRegisteredLoggers",
304
305 LoggerInfo => "logger:info",
306
307 LoggerLog => "logger:log",
308
309 LoggerRegisterLogger => "logger:registerLogger",
310
311 LoggerSetLevel => "logger:setLevel",
312
313 LoggerSetVisibility => "logger:setVisibility",
314
315 LoggerTrace => "logger:trace",
316
317 LoggerWarn => "logger:warn",
318
319 MenubarUpdateMenubar => "menubar:updateMenubar",
321
322 ModelClose => "model:close",
324
325 ModelGet => "model:get",
326
327 ModelGetAll => "model:getAll",
328
329 ModelOpen => "model:open",
330
331 ModelUpdateContent => "model:updateContent",
332
333 NativeOpenExternal => "native:openExternal",
335
336 NativeShowItemInFolder => "native:showItemInFolder",
337
338 NotificationEndProgress => "notification:endProgress",
340
341 NotificationShow => "notification:show",
342
343 NotificationShowProgress => "notification:showProgress",
344
345 NotificationUpdateProgress => "notification:updateProgress",
346
347 OutputAppend => "output:append",
349
350 OutputAppendLine => "output:appendLine",
351
352 OutputClear => "output:clear",
353
354 OutputCreate => "output:create",
355
356 OutputShow => "output:show",
357
358 ProgressBegin => "progress:begin",
360
361 ProgressEnd => "progress:end",
362
363 ProgressReport => "progress:report",
364
365 SearchFindFiles => "search:findFiles",
367
368 SearchFindInFiles => "search:findInFiles",
369
370 StorageClose => "storage:close",
372
373 StorageDelete => "storage:delete",
374
375 StorageGet => "storage:get",
376
377 StorageGetItems => "storage:getItems",
378
379 StorageIsUsed => "storage:isUsed",
380
381 StorageKeys => "storage:keys",
382
383 StorageOptimize => "storage:optimize",
384
385 StorageSet => "storage:set",
386
387 StorageUpdateItems => "storage:updateItems",
388
389 QuickInputShowInputBox => "quickInput:showInputBox",
391
392 QuickInputShowQuickPick => "quickInput:showQuickPick",
393
394 TextFileRead => "textFile:read",
396
397 TextFileWrite => "textFile:write",
398
399 TextFileSave => "textFile:save",
400
401 WorkingCopyGetAllDirty => "workingCopy:getAllDirty",
403
404 WorkingCopyGetDirtyCount => "workingCopy:getDirtyCount",
405
406 WorkingCopyIsDirty => "workingCopy:isDirty",
407
408 WorkingCopySetDirty => "workingCopy:setDirty",
409
410 TerminalCreate => "terminal:create",
412
413 TerminalDispose => "terminal:dispose",
414
415 TerminalHide => "terminal:hide",
416
417 TerminalSendText => "terminal:sendText",
418
419 TerminalShow => "terminal:show",
420
421 ThemesGetActive => "themes:getActive",
423
424 ThemesList => "themes:list",
425
426 ThemesSet => "themes:set",
427
428 UpdateApplyUpdate => "update:applyUpdate",
430
431 UpdateCheckForUpdates => "update:checkForUpdates",
432
433 UpdateDownloadUpdate => "update:downloadUpdate",
434
435 UpdateIsLatestVersion => "update:isLatestVersion",
436
437 UpdateQuitAndInstall => "update:quitAndInstall",
438
439 URLRegisterExternalURIOpener => "url:registerExternalUriOpener",
441
442 WorkbenchGetConfiguration => "workbench:getConfiguration",
444
445 WorkspacesAddFolder => "workspaces:addFolder",
447
448 WorkspacesAddRecentlyOpened => "workspaces:addRecentlyOpened",
449
450 WorkspacesClearRecentlyOpened => "workspaces:clearRecentlyOpened",
451
452 WorkspacesCreateUntitledWorkspace => "workspaces:createUntitledWorkspace",
453
454 WorkspacesDeleteUntitledWorkspace => "workspaces:deleteUntitledWorkspace",
455
456 WorkspacesEnterWorkspace => "workspaces:enterWorkspace",
457
458 WorkspacesGetDirtyWorkspaces => "workspaces:getDirtyWorkspaces",
459
460 WorkspacesGetFolders => "workspaces:getFolders",
461
462 WorkspacesGetName => "workspaces:getName",
463
464 WorkspacesGetRecentlyOpened => "workspaces:getRecentlyOpened",
465
466 WorkspacesGetWorkspaceIdentifier => "workspaces:getWorkspaceIdentifier",
467
468 WorkspacesRemoveFolder => "workspaces:removeFolder",
469
470 WorkspacesRemoveRecentlyOpened => "workspaces:removeRecentlyOpened",
471
472 MountainGetStatus => "mountain_get_status",
481
482 UserInterfaceShowOpenDialog => "UserInterface.ShowOpenDialog",
483
484 UserInterfaceShowSaveDialog => "UserInterface.ShowSaveDialog",
485}
486
487impl Channel {
488 pub fn Priority(&self) -> ChannelPriority {
491 use Channel::*;
492
493 match self {
494 CommandsExecute
496 | CocoonExtensionHostMessage
497 | ExtensionsInstall
498 | ExtensionsUninstall
499 | ExtensionsReinstall
500 | FileRead
501 | FileReadBinary
502 | FileReadFile
503 | FileStat
504 | FileExists
505 | FileOpen
506 | FileWrite
507 | FileWriteBinary
508 | FileWriteFile
509 | FileDelete
510 | FileCopy
511 | FileMove
512 | FileRename
513 | FileMkdir
514 | KeybindingLookup
515 | MenubarUpdateMenubar
516 | ModelUpdateContent
517 | NativeOpenExternal
518 | NativeShowItemInFolder
519 | NotificationShow
520 | NotificationShowProgress
521 | NotificationUpdateProgress
522 | NotificationEndProgress
523 | TerminalCreate
524 | TerminalSendText
525 | TerminalShow
526 | TerminalHide
527 | TerminalDispose
528 | WorkspacesEnterWorkspace
529 | WorkspacesAddFolder
530 | WorkspacesRemoveFolder
531 | WorkspacesCreateUntitledWorkspace
532 | WorkspacesDeleteUntitledWorkspace => ChannelPriority::High,
533
534 GitClone
536 | GitFetch
537 | GitPull
538 | GitRevListCount
539 | SearchFindFiles
540 | SearchFindInFiles
541 | LogCreateLogger
542 | LogRegisterLogger
543 | LoggerCreateLogger
544 | LoggerCritical
545 | LoggerDebug
546 | LoggerDeregisterLogger
547 | LoggerError
548 | LoggerFlush
549 | LoggerGetLevel
550 | LoggerGetRegisteredLoggers
551 | LoggerInfo
552 | LoggerLog
553 | LoggerRegisterLogger
554 | LoggerSetLevel
555 | LoggerSetVisibility
556 | LoggerTrace
557 | LoggerWarn
558 | StorageOptimize
559 | UpdateCheckForUpdates
560 | UpdateDownloadUpdate
561 | UpdateApplyUpdate
562 | UpdateIsLatestVersion
563 | UpdateQuitAndInstall
564 | ExtensionsQuery
565 | ExtensionsGetRecommendations
566 | ExtensionsGetExtensions
567 | ExtensionsGetExtensionsControlManifest
568 | ExtensionsGetUninstalled
569 | ExtensionsUpdateMetadata
570 | DiagnosticLog => ChannelPriority::Low,
571
572 _ => ChannelPriority::Normal,
574 }
575 }
576}
577
578#[cfg(test)]
579mod Tests {
580
581 use std::str::FromStr;
582
583 use super::{Channel, ChannelPriority};
584
585 #[test]
586 fn RoundTrip() {
587 for Variant in Channel::All() {
588 let Wire = Variant.AsStr();
589
590 let Parsed = Channel::from_str(Wire).expect("round-trip");
591
592 assert_eq!(*Variant, Parsed, "{} failed round-trip", Wire);
593 }
594 }
595
596 #[test]
597 fn PriorityIsTotal() {
598 for Variant in Channel::All() {
602 let _Class = Variant.Priority();
603 }
604 }
605
606 #[test]
607 fn UserActionIsHigh() {
608 assert_eq!(Channel::CommandsExecute.Priority(), ChannelPriority::High);
609
610 assert_eq!(Channel::ExtensionsInstall.Priority(), ChannelPriority::High);
611
612 assert_eq!(Channel::TerminalSendText.Priority(), ChannelPriority::High);
613 }
614
615 #[test]
616 fn BackgroundIsLow() {
617 assert_eq!(Channel::SearchFindInFiles.Priority(), ChannelPriority::Low);
618
619 assert_eq!(Channel::LoggerInfo.Priority(), ChannelPriority::Low);
620 }
621
622 #[test]
623 fn RejectsUnknown() {
624 assert!(Channel::from_str("nope:nope").is_err());
625
626 assert!(Channel::from_str("").is_err());
627 }
628
629 #[test]
630 fn UniqueWireStrings() {
631 let mut Seen = std::collections::HashSet::new();
632
633 for Variant in Channel::All() {
634 assert!(Seen.insert(Variant.AsStr()), "duplicate wire: {}", Variant.AsStr());
635 }
636 }
637}