Skip to main content

DevelopmentNodeEnvironment_MicrosoftVSCodeDependency_22NodeVersion_Bundle_Clean_Debug_ElectronProfile_EsbuildCompiler_Mountain/RPC/CocoonService/GenericNotification/
Dispatcher.rs

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