Mountain/RPC/CocoonService/Initialization/
InitExtensionHost.rs1#![allow(non_snake_case)]
2
3use 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}