Skip to main content

Mountain/RPC/CocoonService/Workspace/
UpdateWorkspaceFolders.rs

1
2//! Apply folder additions/removals to `ApplicationState.Workspace`. URIs
3//! drive removal matching; new folders are appended after the existing
4//! set so existing indices stay stable.
5
6use 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}