1use 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 let Params:serde_json::Value = if notification.parameter.is_empty() {
38 serde_json::Value::Null
39 } else {
40 serde_json::from_slice(¬ification.parameter).unwrap_or(serde_json::Value::Null)
41 };
42
43 match notification.method.as_str() {
44 "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 "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 "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 "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 "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.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.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 "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 "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.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 "set_language_configuration" => {
592 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}