Skip to main content

DevelopmentNodeEnvironment_MicrosoftVSCodeDependency_22NodeVersion_Bundle_Clean_Debug_ElectronProfile_EsbuildCompiler_Mountain/RPC/CocoonService/Initialization/
InitExtensionHost.rs

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