1#![allow(unused_variables, dead_code, unused_imports)]
2
3use 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 let Params:serde_json::Value = if notification.parameter.is_empty() {
40 serde_json::Value::Null
41 } else {
42 serde_json::from_slice(¬ification.parameter).unwrap_or(serde_json::Value::Null)
43 };
44
45 match notification.method.as_str() {
46 "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 "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 "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 "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 "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.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.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 "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 "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.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 "set_language_configuration" => {
594 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}