1#![allow(non_snake_case, non_camel_case_types)]
29
30macro_rules! DefineSkyEvents {
31 ($($Variant:ident => $Wire:literal,)* $(,)?) => {
32 #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
34 pub enum SkyEvent {
35 $($Variant,)*
36 }
37
38 impl SkyEvent {
39 pub fn AsStr(&self) -> &'static str {
41 match self {
42 $(Self::$Variant => $Wire,)*
43 }
44 }
45
46 pub fn All() -> &'static [Self] {
48 &[$(Self::$Variant,)*]
49 }
50 }
51
52 impl ::std::fmt::Display for SkyEvent {
53 fn fmt(&self, Formatter:&mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
54 Formatter.write_str(self.AsStr())
55 }
56 }
57
58 impl ::std::str::FromStr for SkyEvent {
59 type Err = ::std::string::String;
60
61 fn from_str(Wire:&str) -> ::std::result::Result<Self, Self::Err> {
62 match Wire {
63 $($Wire => Ok(Self::$Variant),)*
64 _ => Err(format!("unknown Sky event: {}", Wire)),
65 }
66 }
67 }
68 };
69}
70
71DefineSkyEvents! {
72 ConfigurationChanged => "sky://configuration/changed",
74
75 DebugDapMessage => "sky://debug/dap-message",
77 DebugRegister => "sky://debug/register",
78 DebugStart => "sky://debug/start",
79 DebugStop => "sky://debug/stop",
80
81 DiagnosticsChanged => "sky://diagnostics/changed",
83
84 CustomEditorSaved => "sky://customEditor/saved",
86
87 DialogOpen => "sky://dialog/open",
89 DialogSave => "sky://dialog/save",
90
91 DocumentsOpen => "sky://documents/open",
93 DocumentsRenamed => "sky://documents/renamed",
94 DocumentsSaved => "sky://documents/saved",
95
96 EditorApplyEdits => "sky://editor/applyEdits",
98 EditorOpenDocument => "sky://editor/openDocument",
99 EditorSaveAll => "sky://editor/saveAll",
100
101 ExtensionsInstalled => "sky://extensions/installed",
103 ExtensionsUninstalled => "sky://extensions/uninstalled",
104
105 ExtHostDebugClose => "sky://exthost/debug-close",
107 ExtHostDebugReload => "sky://exthost/debug-reload",
108
109 InputBoxShow => "sky://input-box/show",
111
112 LanguageConfigure => "sky://language/configure",
114 LanguagesSetDocumentLanguage => "sky://languages/setDocumentLanguage",
115
116 LifecyclePhaseChanged => "sky://lifecycle/phaseChanged",
118 LifecycleWillShutdown => "sky://lifecycle/willShutdown",
119
120 NativeOpenExternal => "sky://native/openExternal",
122
123 NotificationProgressBegin => "sky://notification/progress-begin",
125 NotificationProgressEnd => "sky://notification/progress-end",
126 NotificationProgressUpdate => "sky://notification/progress-update",
127 NotificationShow => "sky://notification/show",
128
129 OutputAppend => "sky://output/append",
131 OutputClear => "sky://output/clear",
132 OutputCreate => "sky://output/create",
133 OutputDispose => "sky://output/dispose",
134 OutputReplace => "sky://output/replace",
135 OutputReveal => "sky://output/reveal",
136 OutputShow => "sky://output/show",
137
138 ProgressBegin => "sky://progress/begin",
140 ProgressComplete => "sky://progress/complete",
141 ProgressEnd => "sky://progress/end",
142 ProgressReport => "sky://progress/report",
143 ProgressStart => "sky://progress/start",
144 ProgressUpdate => "sky://progress/update",
145
146 QuickPickShow => "sky://quickpick/show",
148
149 SCMGroupChanged => "sky://scm/group/changed",
151 SCMProviderAdded => "sky://scm/provider/added",
152 SCMProviderChanged => "sky://scm/provider/changed",
153 SCMProviderRemoved => "sky://scm/provider/removed",
154 SCMRegister => "sky://scm/register",
155 SCMUpdateGroup => "sky://scm/updateGroup",
156
157 StatusBarCreate => "sky://statusbar/create",
163 StatusBarDispose => "sky://statusbar/dispose",
164 StatusBarDisposeEntry => "sky://statusbar/dispose-entry",
165 StatusBarDisposeMessage => "sky://statusbar/dispose-message",
166 StatusBarSetEntry => "sky://statusbar/set-entry",
167 StatusBarSetMessage => "sky://statusbar/set-message",
168 StatusBarUpdate => "sky://statusbar/update",
169
170 TaskExecute => "sky://task/execute",
172 TaskTerminate => "sky://task/terminate",
173
174 TerminalClosed => "sky://terminal/closed",
176 TerminalCreate => "sky://terminal/create",
177 TerminalData => "sky://terminal/data",
178 TerminalExit => "sky://terminal/exit",
179 TerminalHide => "sky://terminal/hide",
180 TerminalOpened => "sky://terminal/opened",
181 TerminalProcessId => "sky://terminal/processId",
182 TerminalResize => "sky://terminal/resize",
183 TerminalShow => "sky://terminal/show",
184
185 TestRegistered => "sky://test/registered",
187 TestRunStarted => "sky://test/run-started",
188 TestRunStatusChanged => "sky://test/run-status-changed",
189
190 ThemeChange => "sky://theme/change",
192
193 TreeViewCreate => "sky://tree-view/create",
199 TreeViewDispose => "sky://tree-view/dispose",
200 TreeViewNodeExpanded => "sky://tree-view/node-expanded",
201 TreeViewRefresh => "sky://tree-view/refresh",
202 TreeViewRestoreState => "sky://tree-view/restore-state",
203 TreeViewReveal => "sky://tree-view/reveal",
204 TreeViewSelectionChanged => "sky://tree-view/selection-changed",
205 TreeViewSetBadge => "sky://tree-view/set-badge",
206 TreeViewSetMessage => "sky://tree-view/set-message",
207 TreeViewSetTitle => "sky://tree-view/set-title",
208
209 UIShowInputBoxRequest => "sky://ui/show-input-box-request",
216 UIShowMessageRequest => "sky://ui/show-message-request",
217 UIShowQuickPickRequest => "sky://ui/show-quick-pick-request",
218
219 VFSFileChange => "sky://vfs/fileChange",
221
222 WebviewCreate => "sky://webview/create",
229 WebviewCreated => "sky://webview/created",
230 WebviewDispose => "sky://webview/dispose",
231 WebviewDisposed => "sky://webview/disposed",
232 WebviewMessage => "sky://webview/message",
233 WebviewOptionsChanged => "sky://webview/options-changed",
234 WebviewPostMessage => "sky://webview/post-message",
235 WebviewRevealed => "sky://webview/revealed",
236 WebviewSetHTML => "sky://webview/set-html",
237
238 WindowShowTextDocument => "sky://window/showTextDocument",
240
241 WorkspaceApplyEdit => "sky://workspace/applyEdit",
243 WorkspacesChanged => "sky://workspaces/changed",
244}
245
246#[cfg(test)]
247mod Tests {
248 use super::SkyEvent;
249 use std::str::FromStr;
250
251 #[test]
252 fn RoundTrip() {
253 for Variant in SkyEvent::All() {
254 let Wire = Variant.AsStr();
255 let Parsed = SkyEvent::from_str(Wire).expect("round-trip");
256 assert_eq!(*Variant, Parsed, "{} failed round-trip", Wire);
257 }
258 }
259
260 #[test]
261 fn EveryWireStartsWithSkyScheme() {
262 for Variant in SkyEvent::All() {
263 assert!(
264 Variant.AsStr().starts_with("sky://"),
265 "{} does not use the sky:// scheme",
266 Variant.AsStr()
267 );
268 }
269 }
270
271 #[test]
272 fn RejectsUnknown() {
273 assert!(SkyEvent::from_str("mountain://nope").is_err());
274 assert!(SkyEvent::from_str("").is_err());
275 }
276
277 #[test]
283 fn RustAndTypeScriptTablesAgree() {
284 use std::{collections::HashSet, path::PathBuf};
285
286 let TsPath = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
287 .join("../Wind/Source/IPC/SkyEvent.ts");
288 let Source = match std::fs::read_to_string(&TsPath) {
289 Ok(S) => S,
290 Err(_) => return,
295 };
296
297 let mut TsWires:HashSet<String> = HashSet::new();
298 for Line in Source.lines() {
299 if let Some(Start) = Line.find("\"sky://") {
300 let Tail = &Line[Start + 1..];
301 if let Some(End) = Tail.find('"') {
302 TsWires.insert(Tail[..End].to_string());
303 }
304 }
305 }
306
307 let RsWires:HashSet<String> =
308 SkyEvent::All().iter().map(|V| V.AsStr().to_string()).collect();
309
310 let OnlyInRust:Vec<_> = RsWires.difference(&TsWires).collect();
311 let OnlyInTs:Vec<_> = TsWires.difference(&RsWires).collect();
312
313 assert!(
314 OnlyInRust.is_empty() && OnlyInTs.is_empty(),
315 "SkyEvent drift between Rust and TS:\n only in Rust: {:?}\n only in TS: {:?}",
316 OnlyInRust,
317 OnlyInTs
318 );
319 }
320
321 #[test]
322 fn UniqueWireStrings() {
323 let mut Seen = std::collections::HashSet::new();
324 for Variant in SkyEvent::All() {
325 assert!(Seen.insert(Variant.AsStr()), "duplicate wire: {}", Variant.AsStr());
326 }
327 }
328}