Skip to main content

Mountain/RPC/CocoonService/GenericNotification/
Dispatcher.rs

1#![allow(unused_variables, dead_code, unused_imports)]
2
3//! Dispatcher for the generic `send_mountain_notification` gRPC endpoint.
4//!
5//! Legacy fire-and-forget rail used by Cocoon's
6//! `MountainGRPCClient.sendNotification(method, params)` for method names
7//! that predate the typed proto endpoints.
8
9use serde_json::json;
10use tonic::{Request, Response, Status};
11use CommonLibrary::{
12	Command::CommandExecutor::CommandExecutor,
13	LanguageFeature::{
14		DTO::ProviderType::ProviderType,
15		LanguageFeatureProviderRegistry::LanguageFeatureProviderRegistry,
16	},
17};
18
19use crate::{
20	RPC::CocoonService::CocoonServiceImpl,
21	Vine::Generated::{Empty, GenericNotification as GenericNotificationMsg},
22	dev_log,
23};
24
25pub async fn Fn(
26	Service:&CocoonServiceImpl,
27
28	request:Request<GenericNotificationMsg>,
29) -> Result<Response<Empty>, Status> {
30	let notification = request.into_inner();
31
32	dev_log!(
33		"cocoon",
34		"[CocoonService] Notification router: method='{}'",
35		notification.method
36	);
37
38	// Deserialise notification parameters as JSON
39	let Params:serde_json::Value = if notification.parameter.is_empty() {
40		serde_json::Value::Null
41	} else {
42		serde_json::from_slice(&notification.parameter).unwrap_or(serde_json::Value::Null)
43	};
44
45	match notification.method.as_str() {
46		// ---- Commands ----
47		"registerCommand" => {
48			let CommandId = Params.get("commandId").and_then(|V| V.as_str()).unwrap_or("").to_string();
49
50			let ExtensionId = Params.get("extensionId").and_then(|V| V.as_str()).unwrap_or("").to_string();
51
52			if let Err(Error) = Service.environment.RegisterCommand(ExtensionId, CommandId.clone()).await {
53				dev_log!(
54					"cocoon",
55					"warn: [CocoonService] notification: registerCommand '{}' failed: {:?}",
56					CommandId,
57					Error
58				);
59			}
60		},
61
62		"unregisterCommand" => {
63			let ExtensionId = Params.get("extensionId").and_then(|V| V.as_str()).unwrap_or("").to_string();
64
65			let CommandId = Params.get("commandId").and_then(|V| V.as_str()).unwrap_or("").to_string();
66
67			let _ = Service.environment.UnregisterCommand(ExtensionId, CommandId).await;
68		},
69
70		// ---- Language Providers (APIFactoryService.ts register_*_provider strings) ----
71		"register_hover_provider" => {
72			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
73
74			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
75
76			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
77
78			Service.RegisterProvider(Handle, ProviderType::Hover, Selector, ExtId);
79		},
80
81		"register_completion_item_provider" => {
82			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
83
84			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
85
86			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
87
88			Service.RegisterProvider(Handle, ProviderType::Completion, Selector, ExtId);
89		},
90
91		"register_definition_provider" => {
92			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
93
94			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
95
96			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
97
98			Service.RegisterProvider(Handle, ProviderType::Definition, Selector, ExtId);
99		},
100
101		"register_reference_provider" => {
102			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
103
104			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
105
106			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
107
108			Service.RegisterProvider(Handle, ProviderType::References, Selector, ExtId);
109		},
110
111		"register_code_actions_provider" => {
112			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
113
114			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
115
116			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
117
118			Service.RegisterProvider(Handle, ProviderType::CodeAction, Selector, ExtId);
119		},
120
121		"register_document_highlight_provider" => {
122			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
123
124			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
125
126			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
127
128			Service.RegisterProvider(Handle, ProviderType::DocumentHighlight, Selector, ExtId);
129		},
130
131		"register_document_symbol_provider" => {
132			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
133
134			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
135
136			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
137
138			Service.RegisterProvider(Handle, ProviderType::DocumentSymbol, Selector, ExtId);
139		},
140
141		"register_workspace_symbol_provider" => {
142			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
143
144			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
145
146			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
147
148			Service.RegisterProvider(Handle, ProviderType::WorkspaceSymbol, Selector, ExtId);
149		},
150
151		"register_rename_provider" => {
152			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
153
154			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
155
156			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
157
158			Service.RegisterProvider(Handle, ProviderType::Rename, Selector, ExtId);
159		},
160
161		"register_document_formatting_provider" => {
162			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
163
164			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
165
166			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
167
168			Service.RegisterProvider(Handle, ProviderType::DocumentFormatting, Selector, ExtId);
169		},
170
171		"register_document_range_formatting_provider" => {
172			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
173
174			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
175
176			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
177
178			Service.RegisterProvider(Handle, ProviderType::DocumentRangeFormatting, Selector, ExtId);
179		},
180
181		"register_on_type_formatting_provider" => {
182			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
183
184			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
185
186			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
187
188			Service.RegisterProvider(Handle, ProviderType::OnTypeFormatting, Selector, ExtId);
189		},
190
191		"register_signature_help_provider" => {
192			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
193
194			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
195
196			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
197
198			Service.RegisterProvider(Handle, ProviderType::SignatureHelp, Selector, ExtId);
199		},
200
201		"register_code_lens_provider" => {
202			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
203
204			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
205
206			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
207
208			Service.RegisterProvider(Handle, ProviderType::CodeLens, Selector, ExtId);
209		},
210
211		"register_folding_range_provider" => {
212			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
213
214			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
215
216			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
217
218			Service.RegisterProvider(Handle, ProviderType::FoldingRange, Selector, ExtId);
219		},
220
221		"register_selection_range_provider" => {
222			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
223
224			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
225
226			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
227
228			Service.RegisterProvider(Handle, ProviderType::SelectionRange, Selector, ExtId);
229		},
230
231		"register_semantic_tokens_provider" => {
232			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
233
234			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
235
236			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
237
238			Service.RegisterProvider(Handle, ProviderType::SemanticTokens, Selector, ExtId);
239		},
240
241		"register_inlay_hints_provider" => {
242			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
243
244			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
245
246			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
247
248			Service.RegisterProvider(Handle, ProviderType::InlayHint, Selector, ExtId);
249		},
250
251		"register_type_hierarchy_provider" => {
252			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
253
254			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
255
256			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
257
258			Service.RegisterProvider(Handle, ProviderType::TypeHierarchy, Selector, ExtId);
259		},
260
261		"register_call_hierarchy_provider" => {
262			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
263
264			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
265
266			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
267
268			Service.RegisterProvider(Handle, ProviderType::CallHierarchy, Selector, ExtId);
269		},
270
271		"register_linked_editing_range_provider" => {
272			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
273
274			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
275
276			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
277
278			Service.RegisterProvider(Handle, ProviderType::LinkedEditingRange, Selector, ExtId);
279		},
280
281		"register_document_link_provider" => {
282			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
283
284			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
285
286			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
287
288			Service.RegisterProvider(Handle, ProviderType::DocumentLink, Selector, ExtId);
289		},
290
291		"register_color_provider" => {
292			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
293
294			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
295
296			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
297
298			Service.RegisterProvider(Handle, ProviderType::Color, Selector, ExtId);
299		},
300
301		"register_implementation_provider" => {
302			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
303
304			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
305
306			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
307
308			Service.RegisterProvider(Handle, ProviderType::Implementation, Selector, ExtId);
309		},
310
311		"register_type_definition_provider" => {
312			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
313
314			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
315
316			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
317
318			Service.RegisterProvider(Handle, ProviderType::TypeDefinition, Selector, ExtId);
319		},
320
321		"register_declaration_provider" => {
322			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
323
324			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
325
326			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
327
328			Service.RegisterProvider(Handle, ProviderType::Declaration, Selector, ExtId);
329		},
330
331		"register_evaluatable_expression_provider" => {
332			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
333
334			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
335
336			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
337
338			Service.RegisterProvider(Handle, ProviderType::EvaluatableExpression, Selector, ExtId);
339		},
340
341		"register_inline_values_provider" => {
342			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0) as u32;
343
344			let Selector = Params.get("language_selector").and_then(|V| V.as_str()).unwrap_or("*");
345
346			let ExtId = Params.get("extension_id").and_then(|V| V.as_str()).unwrap_or("");
347
348			Service.RegisterProvider(Handle, ProviderType::InlineValues, Selector, ExtId);
349		},
350
351		// ---- Webview ----
352		"onDidReceiveMessage" => {
353			use tauri::Emitter;
354
355			let Handle = Params.get("handle").and_then(|V| V.as_u64()).unwrap_or(0);
356
357			let Message = Params
358				.get("stringMessage")
359				.and_then(|V| V.as_str())
360				.map(|S| S.to_string())
361				.or_else(|| Params.get("bytesMessage").map(|_| "[binary]".to_string()))
362				.unwrap_or_default();
363
364			let _ = Service
365				.environment
366				.ApplicationHandle
367				.emit("sky://webview/post-message", json!({ "handle": Handle, "message": Message }));
368		},
369
370		// ---- Secrets (fire-and-forget variants) ----
371		"storeSecret" => {
372			use CommonLibrary::Secret::SecretProvider::SecretProvider;
373
374			let ExtensionId = Params.get("extensionId").and_then(|V| V.as_str()).unwrap_or("").to_string();
375
376			let Key = Params.get("key").and_then(|V| V.as_str()).unwrap_or("").to_string();
377
378			let Value = Params.get("value").and_then(|V| V.as_str()).unwrap_or("").to_string();
379
380			let _ = Service.environment.StoreSecret(ExtensionId, Key, Value).await;
381		},
382
383		"deleteSecret" => {
384			use CommonLibrary::Secret::SecretProvider::SecretProvider;
385
386			let ExtensionId = Params.get("extensionId").and_then(|V| V.as_str()).unwrap_or("").to_string();
387
388			let Key = Params.get("key").and_then(|V| V.as_str()).unwrap_or("").to_string();
389
390			let _ = Service.environment.DeleteSecret(ExtensionId, Key).await;
391		},
392
393		// ---- File system (fire-and-forget write) ----
394		"writeFile" => {
395			let Uri = Params
396				.get("uri")
397				.and_then(|V| V.get("value").or(Some(V)))
398				.and_then(|V| V.as_str())
399				.unwrap_or("")
400				.replace("file://", "");
401
402			let Content:Vec<u8> = Params
403				.get("content")
404				.and_then(|V| V.as_array())
405				.map(|A| A.iter().filter_map(|B| B.as_u64().map(|N| N as u8)).collect())
406				.unwrap_or_default();
407
408			let _ = tokio::fs::write(&Uri, &Content).await;
409		},
410
411		// ---- Webview panel ----
412		"webview.postMessage" => {
413			use tauri::Emitter;
414
415			let PanelId = Params.get("panelId").and_then(|V| V.as_str()).unwrap_or("").to_string();
416
417			let Method = Params.get("method").and_then(|V| V.as_str()).unwrap_or("").to_string();
418
419			let MsgParams = Params.get("params").cloned().unwrap_or(serde_json::Value::Null);
420
421			let _ = Service.environment.ApplicationHandle.emit(
422				"sky://webview/message",
423				json!({ "panelId": PanelId, "method": Method, "params": MsgParams }),
424			);
425		},
426
427		"webview.dispose" => {
428			use tauri::Emitter;
429
430			let PanelId = Params.get("panelId").and_then(|V| V.as_str()).unwrap_or("").to_string();
431
432			let _ = Service
433				.environment
434				.ApplicationHandle
435				.emit("sky://webview/dispose", json!({ "panelId": PanelId }));
436		},
437
438		// ---- Progress indicator ----
439		"progress.start" => {
440			use tauri::Emitter;
441
442			let Id = Params.get("id").and_then(|V| V.as_str()).unwrap_or("").to_string();
443
444			let Title = Params.get("title").and_then(|V| V.as_str()).map(|S| S.to_string());
445
446			let Location = Params.get("location").cloned();
447
448			let Cancellable = Params.get("cancellable").and_then(|V| V.as_bool()).unwrap_or(false);
449
450			let _ = Service.environment.ApplicationHandle.emit(
451				"sky://progress/start",
452				json!({ "id": Id, "title": Title, "location": Location, "cancellable": Cancellable }),
453			);
454		},
455
456		"progress.update" => {
457			use tauri::Emitter;
458
459			let Id = Params.get("id").and_then(|V| V.as_str()).unwrap_or("").to_string();
460
461			let Message = Params.get("message").and_then(|V| V.as_str()).map(|S| S.to_string());
462
463			let Increment = Params.get("increment").and_then(|V| V.as_f64());
464
465			let _ = Service.environment.ApplicationHandle.emit(
466				"sky://progress/update",
467				json!({ "id": Id, "message": Message, "increment": Increment }),
468			);
469		},
470
471		"progress.complete" => {
472			use tauri::Emitter;
473
474			let Id = Params.get("id").and_then(|V| V.as_str()).unwrap_or("").to_string();
475
476			let _ = Service
477				.environment
478				.ApplicationHandle
479				.emit("sky://progress/complete", json!({ "id": Id }));
480		},
481
482		// ---- Native shell ----
483		"openExternal" => {
484			use tauri::Emitter;
485
486			let Url = Params.get("url").and_then(|V| V.as_str()).unwrap_or("").to_string();
487
488			let _ = Service
489				.environment
490				.ApplicationHandle
491				.emit("sky://native/openExternal", json!({ "url": Url }));
492		},
493
494		// ---- StatusBar updates (fire-and-forget from Window.ts setters) ----
495		"setStatusBarText" | "statusBar.setText" => {
496			use tauri::Emitter;
497
498			let ItemId = Params.get("itemId").and_then(|V| V.as_str()).unwrap_or("").to_string();
499
500			let Text = Params.get("text").and_then(|V| V.as_str()).unwrap_or("").to_string();
501
502			let _ = Service
503				.environment
504				.ApplicationHandle
505				.emit("sky://statusbar/update", json!({ "id": ItemId, "text": Text }));
506		},
507
508		"disposeStatusBarItem" | "statusBar.dispose" => {
509			use tauri::Emitter;
510
511			let ItemId = Params.get("itemId").and_then(|V| V.as_str()).unwrap_or("").to_string();
512
513			let _ = Service
514				.environment
515				.ApplicationHandle
516				.emit("sky://statusbar/dispose", json!({ "id": ItemId }));
517		},
518
519		// ---- Output channel (fire-and-forget from Window.ts OutputChannel proxy) ----
520		"output.create" => {
521			use tauri::Emitter;
522
523			let Id = Params.get("id").and_then(|V| V.as_str()).unwrap_or("").to_string();
524
525			let Name = Params.get("name").and_then(|V| V.as_str()).unwrap_or("").to_string();
526
527			let _ = Service
528				.environment
529				.ApplicationHandle
530				.emit("sky://output/create", json!({ "id": Id, "name": Name }));
531		},
532
533		"output.append" => {
534			use tauri::Emitter;
535
536			let Channel = Params.get("channel").and_then(|V| V.as_str()).unwrap_or("").to_string();
537
538			let Text = Params.get("value").and_then(|V| V.as_str()).unwrap_or("").to_string();
539
540			let _ = Service
541				.environment
542				.ApplicationHandle
543				.emit("sky://output/append", json!({ "channel": Channel, "text": Text }));
544		},
545
546		"output.appendLine" => {
547			use tauri::Emitter;
548
549			let Channel = Params.get("channel").and_then(|V| V.as_str()).unwrap_or("").to_string();
550
551			let Line = Params.get("value").and_then(|V| V.as_str()).unwrap_or("").to_string();
552
553			let _ = Service.environment.ApplicationHandle.emit(
554				"sky://output/append",
555				json!({ "channel": Channel, "text": format!("{}\n", Line) }),
556			);
557		},
558
559		"output.clear" => {
560			use tauri::Emitter;
561
562			let Channel = Params.get("channel").and_then(|V| V.as_str()).unwrap_or("").to_string();
563
564			let _ = Service
565				.environment
566				.ApplicationHandle
567				.emit("sky://output/clear", json!({ "channel": Channel }));
568		},
569
570		"output.show" => {
571			use tauri::Emitter;
572
573			let Channel = Params.get("channel").and_then(|V| V.as_str()).unwrap_or("").to_string();
574
575			let _ = Service
576				.environment
577				.ApplicationHandle
578				.emit("sky://output/show", json!({ "channel": Channel }));
579		},
580
581		"output.dispose" => {
582			use tauri::Emitter;
583
584			let Channel = Params.get("channel").and_then(|V| V.as_str()).unwrap_or("").to_string();
585
586			let _ = Service
587				.environment
588				.ApplicationHandle
589				.emit("sky://output/dispose", json!({ "channel": Channel }));
590		},
591
592		// ---- Language configuration ----
593		"set_language_configuration" => {
594			// Language configuration is consumed by Sky - emit for workbench to pick up
595			use tauri::Emitter;
596
597			let Language = Params.get("language").and_then(|V| V.as_str()).unwrap_or("").to_string();
598
599			let _ = Service
600				.environment
601				.ApplicationHandle
602				.emit("sky://language/configure", json!({ "language": Language }));
603		},
604
605		_ => {
606			dev_log!(
607				"cocoon",
608				"[CocoonService] Unknown notification method: '{}'",
609				notification.method
610			);
611		},
612	}
613
614	Ok(Response::new(Empty {}))
615}