Skip to main content

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}