1#![allow(non_camel_case_types)]
30
31macro_rules! DefineSkyEvents {
32
33 ($($Variant:ident => $Wire:literal,)* $(,)?) => {
34
35 #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
37 pub enum SkyEvent {
38
39 $($Variant,)*
40 }
41
42 impl SkyEvent {
43
44 pub fn AsStr(&self) -> &'static str {
46
47 match self {
48
49 $(Self::$Variant => $Wire,)*
50 }
51 }
52
53 pub fn All() -> &'static [Self] {
55
56 &[$(Self::$Variant,)*]
57 }
58 }
59
60 impl ::std::fmt::Display for SkyEvent {
61
62 fn fmt(&self, Formatter:&mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
63
64 Formatter.write_str(self.AsStr())
65 }
66 }
67
68 impl ::std::str::FromStr for SkyEvent {
69
70 type Err = ::std::string::String;
71
72 fn from_str(Wire:&str) -> ::std::result::Result<Self, Self::Err> {
73
74 match Wire {
75
76 $($Wire => Ok(Self::$Variant),)*
77 _ => Err(format!("unknown Sky event: {}", Wire)),
78 }
79 }
80 }
81 };
82}
83
84DefineSkyEvents! {
85
86 ConfigurationChanged => "sky://configuration/changed",
88
89 DebugDapMessage => "sky://debug/dap-message",
91
92 DebugRegister => "sky://debug/register",
93
94 DebugStart => "sky://debug/start",
95
96 DebugStop => "sky://debug/stop",
97
98 DecorationSetRanges => "sky://decoration/set-ranges",
103
104 DiagnosticsChanged => "sky://diagnostics/changed",
106
107 CustomEditorSaved => "sky://customEditor/saved",
109
110 DialogOpen => "sky://dialog/open",
112
113 DialogSave => "sky://dialog/save",
114
115 DocumentsOpen => "sky://documents/open",
117
118 DocumentsRenamed => "sky://documents/renamed",
119
120 DocumentsSaved => "sky://documents/saved",
121
122 EditorApplyEdits => "sky://editor/applyEdits",
124
125 EditorApplyTextEdits => "sky://editor/apply-text-edits",
128
129 EditorSelectionChanged => "sky://editor/selection-changed",
133
134 EditorOpenDocument => "sky://editor/openDocument",
135
136 EditorSaveAll => "sky://editor/saveAll",
137
138 EditorActiveChanged => "sky://editor/active-changed",
141
142 EditorRevealRange => "sky://editor/revealRange",
145
146 ExtensionsInstalled => "sky://extensions/installed",
148
149 ExtensionsUninstalled => "sky://extensions/uninstalled",
150
151 ExtHostDebugClose => "sky://exthost/debug-close",
153
154 ExtHostDebugReload => "sky://exthost/debug-reload",
155
156 InputBoxShow => "sky://input-box/show",
158
159 LanguageConfigure => "sky://language/configure",
161
162 LanguagesSetDocumentLanguage => "sky://languages/setDocumentLanguage",
163
164 LifecyclePhaseChanged => "sky://lifecycle/phaseChanged",
166
167 LifecycleWillShutdown => "sky://lifecycle/willShutdown",
168
169 NativeOpenExternal => "sky://native/openExternal",
171
172 NotificationProgressBegin => "sky://notification/progress-begin",
174
175 NotificationProgressEnd => "sky://notification/progress-end",
176
177 NotificationProgressUpdate => "sky://notification/progress-update",
178
179 NotificationShow => "sky://notification/show",
180
181 OutputAppend => "sky://output/append",
183
184 OutputClear => "sky://output/clear",
185
186 OutputCreate => "sky://output/create",
187
188 OutputDispose => "sky://output/dispose",
189
190 OutputReplace => "sky://output/replace",
191
192 OutputReveal => "sky://output/reveal",
193
194 OutputShow => "sky://output/show",
195
196 ProgressBegin => "sky://progress/begin",
198
199 ProgressComplete => "sky://progress/complete",
200
201 ProgressEnd => "sky://progress/end",
202
203 ProgressReport => "sky://progress/report",
204
205 ProgressStart => "sky://progress/start",
206
207 ProgressUpdate => "sky://progress/update",
208
209 QuickPickShow => "sky://quickpick/show",
211
212 SCMGroupChanged => "sky://scm/group/changed",
214
215 SCMProviderAdded => "sky://scm/provider/added",
216
217 SCMProviderChanged => "sky://scm/provider/changed",
218
219 SCMProviderRemoved => "sky://scm/provider/removed",
220
221 SCMRegister => "sky://scm/register",
222
223 SCMUpdateGroup => "sky://scm/updateGroup",
224
225 StatusBarCreate => "sky://statusbar/create",
231
232 StatusBarDispose => "sky://statusbar/dispose",
233
234 StatusBarDisposeEntry => "sky://statusbar/dispose-entry",
235
236 StatusBarDisposeMessage => "sky://statusbar/dispose-message",
237
238 StatusBarSetEntry => "sky://statusbar/set-entry",
239
240 StatusBarSetMessage => "sky://statusbar/set-message",
241
242 StatusBarUpdate => "sky://statusbar/update",
243
244 TaskExecute => "sky://task/execute",
246
247 TaskTerminate => "sky://task/terminate",
248
249 TerminalClosed => "sky://terminal/closed",
251
252 TerminalCreate => "sky://terminal/create",
253
254 TerminalData => "sky://terminal/data",
255
256 TerminalExit => "sky://terminal/exit",
257
258 TerminalHide => "sky://terminal/hide",
259
260 TerminalOpened => "sky://terminal/opened",
261
262 TerminalProcessId => "sky://terminal/processId",
263
264 TerminalResize => "sky://terminal/resize",
265
266 TerminalShow => "sky://terminal/show",
267
268 TestRegistered => "sky://test/registered",
270
271 TestRunStarted => "sky://test/run-started",
272
273 TestRunStatusChanged => "sky://test/run-status-changed",
274
275 ThemeChange => "sky://theme/change",
277
278 TreeViewCreate => "sky://tree-view/create",
284
285 TreeViewDispose => "sky://tree-view/dispose",
286
287 TreeViewNodeExpanded => "sky://tree-view/node-expanded",
288
289 TreeViewRefresh => "sky://tree-view/refresh",
290
291 TreeViewRestoreState => "sky://tree-view/restore-state",
292
293 TreeViewReveal => "sky://tree-view/reveal",
294
295 TreeViewSelectionChanged => "sky://tree-view/selection-changed",
296
297 TreeViewSetBadge => "sky://tree-view/set-badge",
298
299 TreeViewSetMessage => "sky://tree-view/set-message",
300
301 TreeViewSetTitle => "sky://tree-view/set-title",
302
303 UIShowInputBoxRequest => "sky://ui/show-input-box-request",
310
311 UIShowMessageRequest => "sky://ui/show-message-request",
312
313 UIShowQuickPickRequest => "sky://ui/show-quick-pick-request",
314
315 VFSFileChange => "sky://vfs/fileChange",
317
318 WebviewCreate => "sky://webview/create",
325
326 WebviewCreated => "sky://webview/created",
327
328 WebviewDispose => "sky://webview/dispose",
329
330 WebviewDisposed => "sky://webview/disposed",
331
332 WebviewMessage => "sky://webview/message",
333
334 WebviewOptionsChanged => "sky://webview/options-changed",
335
336 WebviewPostMessage => "sky://webview/post-message",
337
338 WebviewRevealed => "sky://webview/revealed",
339
340 WebviewSetHTML => "sky://webview/set-html",
341
342 WindowShowTextDocument => "sky://window/showTextDocument",
344
345 WorkspaceApplyEdit => "sky://workspace/applyEdit",
347
348 WorkspacesChanged => "sky://workspaces/changed",
349}
350
351#[cfg(test)]
352mod Tests {
353
354 use std::str::FromStr;
355
356 use super::SkyEvent;
357
358 #[test]
359 fn RoundTrip() {
360 for Variant in SkyEvent::All() {
361 let Wire = Variant.AsStr();
362
363 let Parsed = SkyEvent::from_str(Wire).expect("round-trip");
364
365 assert_eq!(*Variant, Parsed, "{} failed round-trip", Wire);
366 }
367 }
368
369 #[test]
370 fn EveryWireStartsWithSkyScheme() {
371 for Variant in SkyEvent::All() {
372 assert!(
373 Variant.AsStr().starts_with("sky://"),
374 "{} does not use the sky:// scheme",
375 Variant.AsStr()
376 );
377 }
378 }
379
380 #[test]
381 fn RejectsUnknown() {
382 assert!(SkyEvent::from_str("mountain://nope").is_err());
383
384 assert!(SkyEvent::from_str("").is_err());
385 }
386
387 #[test]
393 fn RustAndTypeScriptTablesAgree() {
394 use std::{collections::HashSet, path::PathBuf};
395
396 let TsPath = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../Wind/Source/IPC/SkyEvent.ts");
397
398 let Source = match std::fs::read_to_string(&TsPath) {
399 Ok(S) => S,
400
401 Err(_) => return,
406 };
407
408 let mut TsWires:HashSet<String> = HashSet::new();
409
410 for Line in Source.lines() {
411 if let Some(Start) = Line.find("\"sky://") {
412 let Tail = &Line[Start + 1..];
413
414 if let Some(End) = Tail.find('"') {
415 TsWires.insert(Tail[..End].to_string());
416 }
417 }
418 }
419
420 let RsWires:HashSet<String> = SkyEvent::All().iter().map(|V| V.AsStr().to_string()).collect();
421
422 let OnlyInRust:Vec<_> = RsWires.difference(&TsWires).collect();
423
424 let OnlyInTs:Vec<_> = TsWires.difference(&RsWires).collect();
425
426 assert!(
427 OnlyInRust.is_empty() && OnlyInTs.is_empty(),
428 "SkyEvent drift between Rust and TS:\n only in Rust: {:?}\n only in TS: {:?}",
429 OnlyInRust,
430 OnlyInTs
431 );
432 }
433
434 #[test]
435 fn UniqueWireStrings() {
436 let mut Seen = std::collections::HashSet::new();
437
438 for Variant in SkyEvent::All() {
439 assert!(Seen.insert(Variant.AsStr()), "duplicate wire: {}", Variant.AsStr());
440 }
441 }
442}