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