Skip to main content

Mountain/RPC/CocoonService/Initialization/
InitExtensionHost.rs

1#![allow(non_snake_case)]
2
3//! Mountain → Cocoon initialization payload (workspace folders +
4//! configuration). Stores parsed folders into `ApplicationState.Workspace`
5//! so the rest of the boot path sees them.
6
7use tonic::{Response, Status};
8
9use crate::{
10	ApplicationState::DTO::WorkspaceFolderStateDTO::WorkspaceFolderStateDTO,
11	RPC::CocoonService::CocoonServiceImpl,
12	Vine::Generated::{Empty, InitExtensionHostRequest},
13	dev_log,
14};
15
16pub async fn Fn(Service:&CocoonServiceImpl, Request:InitExtensionHostRequest) -> Result<Response<Empty>, Status> {
17	dev_log!(
18		"cocoon",
19		"[CocoonService] Initializing extension host with {} workspace folders",
20		Request.workspace_folders.len()
21	);
22
23	for Folder in &Request.workspace_folders {
24		dev_log!(
25			"cocoon",
26			"[CocoonService] Workspace folder: {} ({})",
27			Folder.name,
28			Folder.uri.as_ref().map(|U| &U.value).unwrap_or(&String::new())
29		);
30	}
31
32	dev_log!("cocoon", "[CocoonService] Configuration: {} keys", Request.configuration.len());
33
34	let Folders:Vec<WorkspaceFolderStateDTO> = Request
35		.workspace_folders
36		.iter()
37		.enumerate()
38		.filter_map(|(Index, F)| {
39			let URI = F.uri.as_ref().map(|U| U.value.as_str()).unwrap_or("");
40			url::Url::parse(URI)
41				.ok()
42				.and_then(|Parsed| WorkspaceFolderStateDTO::New(Parsed, F.name.clone(), Index).ok())
43		})
44		.collect();
45
46	if !Folders.is_empty() {
47		Service.environment.ApplicationState.Workspace.SetWorkspaceFolders(Folders);
48		dev_log!(
49			"cocoon",
50			"[CocoonService] Workspace folders stored: {}",
51			Request.workspace_folders.len()
52		);
53	}
54
55	Ok(Response::new(Empty {}))
56}