Mountain/RPC/CocoonService/Workspace/
UpdateWorkspaceFolders.rs1
2use tonic::{Response, Status};
7
8use crate::{
9 ApplicationState::{
10 DTO::WorkspaceFolderStateDTO::WorkspaceFolderStateDTO,
11 State::WorkspaceState::WorkspaceDelta::UpdateWorkspaceFoldersAndNotify,
12 },
13 RPC::CocoonService::CocoonServiceImpl,
14 Vine::Generated::{Empty, UpdateWorkspaceFoldersRequest},
15 dev_log,
16};
17
18pub async fn Fn(Service:&CocoonServiceImpl, Request:UpdateWorkspaceFoldersRequest) -> Result<Response<Empty>, Status> {
19 dev_log!(
20 "cocoon",
21 "[CocoonService] Updating workspace: {} additions, {} removals",
22 Request.additions.len(),
23 Request.removals.len()
24 );
25
26 for Addition in &Request.additions {
27 dev_log!(
28 "cocoon",
29 "[CocoonService] Adding workspace folder: {} ({})",
30 Addition.name,
31 Addition.uri.as_ref().map(|U| &U.value).unwrap_or(&"?".to_string())
32 );
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
52 Folders.retain(|F| !RemovalURIs.contains(&F.URI.to_string()));
53
54 let ExistingCount = Folders.len();
55
56 for (Index, Addition) in Request.additions.iter().enumerate() {
57 let URI = Addition.uri.as_ref().map(|U| U.value.as_str()).unwrap_or("");
58
59 if let Ok(Parsed) = url::Url::parse(URI) {
60 if let Ok(DTO) = WorkspaceFolderStateDTO::New(Parsed, Addition.name.clone(), ExistingCount + Index) {
61 Folders.push(DTO);
62 }
63 }
64 }
65
66 UpdateWorkspaceFoldersAndNotify(&Service.environment.ApplicationState.Workspace, Folders);
67 }
68
69 Ok(Response::new(Empty {}))
70}