Mountain/RPC/CocoonService/Workspace/
UpdateWorkspaceFolders.rs1#![allow(non_snake_case)]
2
3use tonic::{Response, Status};
8
9use crate::{
10 ApplicationState::{
11 DTO::WorkspaceFolderStateDTO::WorkspaceFolderStateDTO,
12 State::WorkspaceState::WorkspaceDelta::UpdateWorkspaceFoldersAndNotify,
13 },
14 RPC::CocoonService::CocoonServiceImpl,
15 Vine::Generated::{Empty, UpdateWorkspaceFoldersRequest},
16 dev_log,
17};
18
19pub async fn Fn(Service:&CocoonServiceImpl, Request:UpdateWorkspaceFoldersRequest) -> Result<Response<Empty>, Status> {
20 dev_log!(
21 "cocoon",
22 "[CocoonService] Updating workspace: {} additions, {} removals",
23 Request.additions.len(),
24 Request.removals.len()
25 );
26
27 for Addition in &Request.additions {
28 dev_log!(
29 "cocoon",
30 "[CocoonService] Adding workspace folder: {} ({})",
31 Addition.name,
32 Addition.uri.as_ref().map(|U| &U.value).unwrap_or(&"?".to_string())
33 );
34 }
35 for Removal in &Request.removals {
36 dev_log!(
37 "cocoon",
38 "[CocoonService] Removing workspace folder: {}",
39 Removal.uri.as_ref().map(|U| &U.value).unwrap_or(&"?".to_string())
40 );
41 }
42
43 {
44 let mut Folders = Service.environment.ApplicationState.Workspace.GetWorkspaceFolders();
45
46 let RemovalURIs:Vec<String> = Request
47 .removals
48 .iter()
49 .filter_map(|F| F.uri.as_ref().map(|U| U.value.clone()))
50 .collect();
51 Folders.retain(|F| !RemovalURIs.contains(&F.URI.to_string()));
52
53 let ExistingCount = Folders.len();
54 for (Index, Addition) in Request.additions.iter().enumerate() {
55 let URI = Addition.uri.as_ref().map(|U| U.value.as_str()).unwrap_or("");
56 if let Ok(Parsed) = url::Url::parse(URI) {
57 if let Ok(DTO) = WorkspaceFolderStateDTO::New(Parsed, Addition.name.clone(), ExistingCount + Index) {
58 Folders.push(DTO);
59 }
60 }
61 }
62
63 UpdateWorkspaceFoldersAndNotify(&Service.environment.ApplicationState.Workspace, Folders);
64 }
65
66 Ok(Response::new(Empty {}))
67}