Vine/Server/Notification/RegisterLanguageProvider.rs
1//! Cocoon → `register_*` / `register_*_provider` notification dispatcher.
2//!
3//! Handles all 46+ language-feature provider registration wire methods that
4//! Cocoon's vscode-API shim emits. Strips the `register_` prefix and optional
5//! `_provider` suffix from the method name to derive a normalised `TypeName`,
6//! logs the registration, then delegates to
7//! `VineHost::RegisterLanguageProvider` which maps `TypeName` to the embedder's
8//! internal provider-type enum and inserts a `ProviderRegistrationDTO`. Returns
9//! `true` if the type was recognised.
10//!
11//! Wire-method naming uses snake_case with two trailing shapes:
12//! - plain verbs: `register_rename`, `register_debug_adapter`
13//! - `_provider` suffix: `register_hover_provider`,
14//! `register_code_lens_provider`
15
16use serde_json::Value;
17
18use crate::{Host::VineHost, dev_log};
19
20pub async fn RegisterLanguageProvider(Host:&dyn VineHost, MethodName:&str, Parameter:&Value) -> bool {
21 let Handle = Parameter.get("handle").and_then(|H| H.as_u64()).unwrap_or(0) as u32;
22
23 let Selector = Parameter
24 .get("languageSelector")
25 .or_else(|| Parameter.get("language_selector"))
26 .and_then(Value::as_str)
27 .unwrap_or("*");
28
29 let TypeName = MethodName
30 .strip_prefix("register_")
31 .map(|S| S.strip_suffix("_provider").unwrap_or(S))
32 .unwrap_or("");
33
34 dev_log!(
35 "provider-register",
36 "[ProviderRegister] method={} type={} handle={} lang={}",
37 MethodName,
38 TypeName,
39 Handle,
40 Selector
41 );
42
43 Host.RegisterLanguageProvider(Handle, TypeName, Parameter)
44}