Skip to main content

Mountain/RPC/CocoonService/Workspace/
UpdateWorkspaceFolders.rs

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