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
36 for Removal in &Request.removals {
37 dev_log!(
38 "cocoon",
39 "[CocoonService] Removing workspace folder: {}",
40 Removal.uri.as_ref().map(|U| &U.value).unwrap_or(&"?".to_string())
41 );
42 }
43
44 {
45 let mut Folders = Service.environment.ApplicationState.Workspace.GetWorkspaceFolders();
46
47 let RemovalURIs:Vec<String> = Request
48 .removals
49 .iter()
50 .filter_map(|F| F.uri.as_ref().map(|U| U.value.clone()))
51 .collect();
52
53 Folders.retain(|F| !RemovalURIs.contains(&F.URI.to_string()));
54
55 let ExistingCount = Folders.len();
56
57 for (Index, Addition) in Request.additions.iter().enumerate() {
58 let URI = Addition.uri.as_ref().map(|U| U.value.as_str()).unwrap_or("");
59
60 if let Ok(Parsed) = url::Url::parse(URI) {
61 if let Ok(DTO) = WorkspaceFolderStateDTO::New(Parsed, Addition.name.clone(), ExistingCount + Index) {
62 Folders.push(DTO);
63 }
64 }
65 }
66
67 UpdateWorkspaceFoldersAndNotify(&Service.environment.ApplicationState.Workspace, Folders);
68 }
69
70 Ok(Response::new(Empty {}))
71}