Skip to main content

Mountain/RPC/CocoonService/Workspace/
UpdateWorkspaceFolders.rs

1#![allow(non_snake_case)]
2
3//! Apply folder additions/removals to `ApplicationState.Workspace`. URIs
4//! drive removal matching; new folders are appended after the existing
5//! set so existing indices stay stable.
6
7use 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	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		Folders.retain(|F| !RemovalURIs.contains(&F.URI.to_string()));
52
53		let ExistingCount = Folders.len();
54		for (Index, Addition) in Request.additions.iter().enumerate() {
55			let URI = Addition.uri.as_ref().map(|U| U.value.as_str()).unwrap_or("");
56			if let Ok(Parsed) = url::Url::parse(URI) {
57				if let Ok(DTO) = WorkspaceFolderStateDTO::New(Parsed, Addition.name.clone(), ExistingCount + Index) {
58					Folders.push(DTO);
59				}
60			}
61		}
62
63		UpdateWorkspaceFoldersAndNotify(&Service.environment.ApplicationState.Workspace, Folders);
64	}
65
66	Ok(Response::new(Empty {}))
67}