1#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
40pub enum ChannelPriority {
41 High,
42
43 Normal,
44
45 Low,
46}
47
48macro_rules! DefineChannels {
49
50 ($($Variant:ident => $Wire:literal,)* $(,)?) => {
51
52 #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
54 pub enum Channel {
55
56 $($Variant,)*
57 }
58
59 impl Channel {
60
61 pub fn AsStr(&self) -> &'static str {
63
64 match self {
65
66 $(Self::$Variant => $Wire,)*
67 }
68 }
69
70 pub fn All() -> &'static [Self] {
72
73 &[$(Self::$Variant,)*]
74 }
75 }
76
77 impl ::std::fmt::Display for Channel {
78
79 fn fmt(&self, Formatter:&mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
80
81 Formatter.write_str(self.AsStr())
82 }
83 }
84
85 impl ::std::str::FromStr for Channel {
86
87 type Err = ::std::string::String;
88
89 fn from_str(Wire:&str) -> ::std::result::Result<Self, Self::Err> {
90
91 match Wire {
92
93 $($Wire => Ok(Self::$Variant),)*
94 _ => Err(format!("unknown IPC channel: {}", Wire)),
95 }
96 }
97 }
98 };
99}
100
101DefineChannels! {
102
103 CocoonExtensionHostMessage => "cocoon:extensionHostMessage",
105
106 CommandsExecute => "commands:execute",
108
109 CommandsGetAll => "commands:getAll",
110
111 ConfigurationGet => "configuration:get",
113
114 ConfigurationInspect => "configuration:inspect",
115
116 ConfigurationLookup => "configuration:lookup",
117
118 ConfigurationUpdate => "configuration:update",
119
120 DecorationsClear => "decorations:clear",
122
123 DecorationsGet => "decorations:get",
124
125 DecorationsGetMany => "decorations:getMany",
126
127 DecorationsSet => "decorations:set",
128
129 DiagnosticLog => "diagnostic:log",
131
132 EncryptionDecrypt => "encryption:decrypt",
134
135 EncryptionEncrypt => "encryption:encrypt",
136
137 EnvironmentGet => "environment:get",
139
140 ExtensionHostDebugServiceAttachSession => "extensionhostdebugservice:attachSession",
142
143 ExtensionHostDebugServiceClose => "extensionhostdebugservice:close",
144
145 ExtensionHostDebugServiceReload => "extensionhostdebugservice:reload",
146
147 ExtensionHostDebugServiceTerminateSession => "extensionhostdebugservice:terminateSession",
148
149 ExtensionsActivate => "extensions:activate",
151
152 ExtensionsGet => "extensions:get",
153
154 ExtensionsGetAll => "extensions:getAll",
155
156 ExtensionsGetExtensions => "extensions:getExtensions",
157
158 ExtensionsGetExtensionsControlManifest => "extensions:getExtensionsControlManifest",
159
160 ExtensionsGetInstalled => "extensions:getInstalled",
161
162 ExtensionsGetRecommendations => "extensions:getRecommendations",
163
164 ExtensionsGetUninstalled => "extensions:getUninstalled",
165
166 ExtensionsGetManifest => "extensions:getManifest",
167
168 ExtensionsInstall => "extensions:install",
169
170 ExtensionsIsActive => "extensions:isActive",
171
172 ExtensionsQuery => "extensions:query",
173
174 ExtensionsReinstall => "extensions:reinstall",
175
176 ExtensionsResetPinnedState => "extensions:resetPinnedStateForAllUserExtensions",
177
178 ExtensionsScanSystemExtensions => "extensions:scanSystemExtensions",
179
180 ExtensionsScanUserExtensions => "extensions:scanUserExtensions",
181
182 ExtensionsUninstall => "extensions:uninstall",
183
184 ExtensionsUpdateMetadata => "extensions:updateMetadata",
185
186 FileCloneFile => "file:cloneFile",
188
189 FileClose => "file:close",
190
191 FileCopy => "file:copy",
192
193 FileDelete => "file:delete",
194
195 FileExists => "file:exists",
196
197 FileMkdir => "file:mkdir",
198
199 FileMove => "file:move",
200
201 FileOpen => "file:open",
202
203 FileRead => "file:read",
204
205 FileReadBinary => "file:readBinary",
206
207 FileReaddir => "file:readdir",
208
209 FileReadFile => "file:readFile",
210
211 FileRealpath => "file:realpath",
212
213 FileRename => "file:rename",
214
215 FileStat => "file:stat",
216
217 FileUnwatch => "file:unwatch",
218
219 FileWatch => "file:watch",
220
221 FileWrite => "file:write",
222
223 FileWriteBinary => "file:writeBinary",
224
225 FileWriteFile => "file:writeFile",
226
227 GitCancel => "git:cancel",
232
233 GitCheckout => "git:checkout",
234
235 GitClone => "git:clone",
236
237 GitExec => "git:exec",
238
239 GitFetch => "git:fetch",
240
241 GitIsAvailable => "git:isAvailable",
242
243 GitPull => "git:pull",
244
245 GitRevListCount => "git:revListCount",
246
247 GitRevParse => "git:revParse",
248
249 HistoryCanGoBack => "history:canGoBack",
251
252 HistoryCanGoForward => "history:canGoForward",
253
254 HistoryClear => "history:clear",
255
256 HistoryGetStack => "history:getStack",
257
258 HistoryGoBack => "history:goBack",
259
260 HistoryGoForward => "history:goForward",
261
262 HistoryPush => "history:push",
263
264 KeybindingAdd => "keybinding:add",
266
267 KeybindingGetAll => "keybinding:getAll",
268
269 KeybindingLookup => "keybinding:lookup",
270
271 KeybindingRemove => "keybinding:remove",
272
273 LabelGetBase => "label:getBase",
275
276 LabelGetURI => "label:getUri",
277
278 LabelGetWorkspace => "label:getWorkspace",
279
280 LifecycleAdvancePhase => "lifecycle:advancePhase",
282
283 LifecycleGetPhase => "lifecycle:getPhase",
284
285 LifecycleRequestShutdown => "lifecycle:requestShutdown",
286
287 LifecycleSetPhase => "lifecycle:setPhase",
288
289 LifecycleWhenPhase => "lifecycle:whenPhase",
290
291 LogCreateLogger => "log:createLogger",
293
294 LogRegisterLogger => "log:registerLogger",
295
296 LoggerCreateLogger => "logger:createLogger",
298
299 LoggerCritical => "logger:critical",
300
301 LoggerDebug => "logger:debug",
302
303 LoggerDeregisterLogger => "logger:deregisterLogger",
304
305 LoggerError => "logger:error",
306
307 LoggerFlush => "logger:flush",
308
309 LoggerGetLevel => "logger:getLevel",
310
311 LoggerGetRegisteredLoggers => "logger:getRegisteredLoggers",
312
313 LoggerInfo => "logger:info",
314
315 LoggerLog => "logger:log",
316
317 LoggerRegisterLogger => "logger:registerLogger",
318
319 LoggerSetLevel => "logger:setLevel",
320
321 LoggerSetVisibility => "logger:setVisibility",
322
323 LoggerTrace => "logger:trace",
324
325 LoggerWarn => "logger:warn",
326
327 MenubarUpdateMenubar => "menubar:updateMenubar",
329
330 ModelClose => "model:close",
332
333 ModelGet => "model:get",
334
335 ModelGetAll => "model:getAll",
336
337 ModelOpen => "model:open",
338
339 ModelUpdateContent => "model:updateContent",
340
341 NativeOpenExternal => "native:openExternal",
343
344 NativeShowItemInFolder => "native:showItemInFolder",
345
346 NotificationEndProgress => "notification:endProgress",
348
349 NotificationShow => "notification:show",
350
351 NotificationShowProgress => "notification:showProgress",
352
353 NotificationUpdateProgress => "notification:updateProgress",
354
355 OutputAppend => "output:append",
357
358 OutputAppendLine => "output:appendLine",
359
360 OutputClear => "output:clear",
361
362 OutputCreate => "output:create",
363
364 OutputShow => "output:show",
365
366 ProgressBegin => "progress:begin",
368
369 ProgressEnd => "progress:end",
370
371 ProgressReport => "progress:report",
372
373 SearchFindFiles => "search:findFiles",
375
376 SearchFindInFiles => "search:findInFiles",
377
378 StorageClose => "storage:close",
380
381 StorageDelete => "storage:delete",
382
383 StorageGet => "storage:get",
384
385 StorageGetItems => "storage:getItems",
386
387 StorageIsUsed => "storage:isUsed",
388
389 StorageKeys => "storage:keys",
390
391 StorageOptimize => "storage:optimize",
392
393 StorageSet => "storage:set",
394
395 StorageUpdateItems => "storage:updateItems",
396
397 StorageOnDidChangeItems => "storage:onDidChangeItems",
399
400 StorageLogStorage => "storage:logStorage",
401
402 QuickInputShowInputBox => "quickInput:showInputBox",
404
405 QuickInputShowQuickPick => "quickInput:showQuickPick",
406
407 TextFileRead => "textFile:read",
409
410 TextFileWrite => "textFile:write",
411
412 TextFileSave => "textFile:save",
413
414 WorkingCopyGetAllDirty => "workingCopy:getAllDirty",
416
417 WorkingCopyGetDirtyCount => "workingCopy:getDirtyCount",
418
419 WorkingCopyIsDirty => "workingCopy:isDirty",
420
421 WorkingCopySetDirty => "workingCopy:setDirty",
422
423 TerminalCreate => "terminal:create",
425
426 TerminalDispose => "terminal:dispose",
427
428 TerminalHide => "terminal:hide",
429
430 TerminalSendText => "terminal:sendText",
431
432 TerminalShow => "terminal:show",
433
434 ThemesGetActive => "themes:getActive",
436
437 ThemesGetColorTheme => "themes:getColorTheme",
438
439 ThemesList => "themes:list",
440
441 ThemesSet => "themes:set",
442
443 UpdateApplyUpdate => "update:applyUpdate",
445
446 UpdateCheckForUpdates => "update:checkForUpdates",
447
448 UpdateDownloadUpdate => "update:downloadUpdate",
449
450 UpdateIsLatestVersion => "update:isLatestVersion",
451
452 UpdateQuitAndInstall => "update:quitAndInstall",
453
454 URLRegisterExternalURIOpener => "url:registerExternalUriOpener",
456
457 WorkbenchGetConfiguration => "workbench:getConfiguration",
459
460 WorkspacesAddFolder => "workspaces:addFolder",
462
463 WorkspacesAddRecentlyOpened => "workspaces:addRecentlyOpened",
464
465 WorkspacesClearRecentlyOpened => "workspaces:clearRecentlyOpened",
466
467 WorkspacesCreateUntitledWorkspace => "workspaces:createUntitledWorkspace",
468
469 WorkspacesDeleteUntitledWorkspace => "workspaces:deleteUntitledWorkspace",
470
471 WorkspacesEnterWorkspace => "workspaces:enterWorkspace",
472
473 WorkspacesGetDirtyWorkspaces => "workspaces:getDirtyWorkspaces",
474
475 WorkspacesGetFolders => "workspaces:getFolders",
476
477 WorkspacesGetName => "workspaces:getName",
478
479 WorkspacesGetRecentlyOpened => "workspaces:getRecentlyOpened",
480
481 WorkspacesGetWorkspaceIdentifier => "workspaces:getWorkspaceIdentifier",
482
483 WorkspacesRemoveFolder => "workspaces:removeFolder",
484
485 WorkspacesRemoveRecentlyOpened => "workspaces:removeRecentlyOpened",
486
487 WorkspacesOnDidChangeWorkspaceFolders => "workspaces:onDidChangeWorkspaceFolders",
489
490 WorkspacesOnDidChangeWorkspaceName => "workspaces:onDidChangeWorkspaceName",
491
492 WorkspacesGetWorkspace => "workspaces:getWorkspace",
494
495 WorkspacesGetWorkspaceFolders => "workspaces:getWorkspaceFolders",
496
497 WorkspacesAddWorkspaceFolders => "workspaces:addWorkspaceFolders",
498
499 WorkspacesRemoveWorkspaceFolders => "workspaces:removeWorkspaceFolders",
500
501 LanguagesGetAll => "languages:getAll",
507
508 LanguagesGetEncodedLanguageId => "languages:getEncodedLanguageId",
509
510 ScmCreateSourceControl => "scm:createSourceControl",
512
513 ScmGetSourceControls => "scm:getSourceControls",
514
515 ScmSetActiveProvider => "scm:setActiveProvider",
516
517 DebugStartDebugging => "debug:startDebugging",
519
520 DebugStopDebugging => "debug:stopDebugging",
521
522 DebugGetSessions => "debug:getSessions",
523
524 DebugGetBreakpoints => "debug:getBreakpoints",
525
526 DebugAddBreakpoints => "debug:addBreakpoints",
527
528 DebugRemoveBreakpoints => "debug:removeBreakpoints",
529
530 TasksExecuteTask => "tasks:executeTask",
532
533 TasksGetTasks => "tasks:getTasks",
534
535 TasksGetTaskExecution => "tasks:getTaskExecution",
536
537 AuthGetSessions => "auth:getSessions",
539
540 AuthCreateSession => "auth:createSession",
541
542 AuthRemoveSession => "auth:removeSession",
543
544 MountainGetStatus => "mountain_get_status",
553
554 UserInterfaceShowOpenDialog => "UserInterface.ShowOpenDialog",
555
556 UserInterfaceShowSaveDialog => "UserInterface.ShowSaveDialog",
557}
558
559impl Channel {
560 pub fn Priority(&self) -> ChannelPriority {
563 use Channel::*;
564
565 match self {
566 CommandsExecute
568 | CocoonExtensionHostMessage
569 | ExtensionsInstall
570 | ExtensionsUninstall
571 | ExtensionsReinstall
572 | FileRead
573 | FileReadBinary
574 | FileReadFile
575 | FileStat
576 | FileExists
577 | FileOpen
578 | FileWrite
579 | FileWriteBinary
580 | FileWriteFile
581 | FileDelete
582 | FileCopy
583 | FileMove
584 | FileRename
585 | FileMkdir
586 | KeybindingLookup
587 | MenubarUpdateMenubar
588 | ModelUpdateContent
589 | NativeOpenExternal
590 | NativeShowItemInFolder
591 | NotificationShow
592 | NotificationShowProgress
593 | NotificationUpdateProgress
594 | NotificationEndProgress
595 | TerminalCreate
596 | TerminalSendText
597 | TerminalShow
598 | TerminalHide
599 | TerminalDispose
600 | WorkspacesEnterWorkspace
601 | WorkspacesAddFolder
602 | WorkspacesRemoveFolder
603 | WorkspacesCreateUntitledWorkspace
604 | WorkspacesDeleteUntitledWorkspace => ChannelPriority::High,
605
606 GitClone
608 | GitFetch
609 | GitPull
610 | GitRevListCount
611 | SearchFindFiles
612 | SearchFindInFiles
613 | LogCreateLogger
614 | LogRegisterLogger
615 | LoggerCreateLogger
616 | LoggerCritical
617 | LoggerDebug
618 | LoggerDeregisterLogger
619 | LoggerError
620 | LoggerFlush
621 | LoggerGetLevel
622 | LoggerGetRegisteredLoggers
623 | LoggerInfo
624 | LoggerLog
625 | LoggerRegisterLogger
626 | LoggerSetLevel
627 | LoggerSetVisibility
628 | LoggerTrace
629 | LoggerWarn
630 | StorageOptimize
631 | UpdateCheckForUpdates
632 | UpdateDownloadUpdate
633 | UpdateApplyUpdate
634 | UpdateIsLatestVersion
635 | UpdateQuitAndInstall
636 | ExtensionsQuery
637 | ExtensionsGetRecommendations
638 | ExtensionsGetExtensions
639 | ExtensionsGetExtensionsControlManifest
640 | ExtensionsGetUninstalled
641 | ExtensionsUpdateMetadata
642 | DiagnosticLog
643 | StorageOnDidChangeItems
644 | StorageLogStorage
645 | WorkspacesOnDidChangeWorkspaceFolders
646 | WorkspacesOnDidChangeWorkspaceName => ChannelPriority::Low,
647
648 _ => ChannelPriority::Normal,
650 }
651 }
652}
653
654#[cfg(test)]
655mod Tests {
656
657 use std::str::FromStr;
658
659 use super::{Channel, ChannelPriority};
660
661 #[test]
662 fn RoundTrip() {
663 for Variant in Channel::All() {
664 let Wire = Variant.AsStr();
665
666 let Parsed = Channel::from_str(Wire).expect("round-trip");
667
668 assert_eq!(*Variant, Parsed, "{} failed round-trip", Wire);
669 }
670 }
671
672 #[test]
673 fn PriorityIsTotal() {
674 for Variant in Channel::All() {
678 let _Class = Variant.Priority();
679 }
680 }
681
682 #[test]
683 fn UserActionIsHigh() {
684 assert_eq!(Channel::CommandsExecute.Priority(), ChannelPriority::High);
685
686 assert_eq!(Channel::ExtensionsInstall.Priority(), ChannelPriority::High);
687
688 assert_eq!(Channel::TerminalSendText.Priority(), ChannelPriority::High);
689 }
690
691 #[test]
692 fn BackgroundIsLow() {
693 assert_eq!(Channel::SearchFindInFiles.Priority(), ChannelPriority::Low);
694
695 assert_eq!(Channel::LoggerInfo.Priority(), ChannelPriority::Low);
696 }
697
698 #[test]
699 fn RejectsUnknown() {
700 assert!(Channel::from_str("nope:nope").is_err());
701
702 assert!(Channel::from_str("").is_err());
703 }
704
705 #[test]
706 fn UniqueWireStrings() {
707 let mut Seen = std::collections::HashSet::new();
708
709 for Variant in Channel::All() {
710 assert!(Seen.insert(Variant.AsStr()), "duplicate wire: {}", Variant.AsStr());
711 }
712 }
713}