Skip to main content

Mountain/IPC/WindServiceHandlers/UI/
Workspace.rs

1#![allow(non_snake_case, unused_variables)]
2//! Workspace folder handlers: get / add / remove / get-name. Thin
3//! wrappers over `ApplicationState::Workspace` that re-broadcast via
4//! `UpdateWorkspaceFoldersAndNotify` so Wind + Sky pick up the new
5//! folder list on the `sky://workspace/*` channels.
6
7use std::sync::Arc;
8
9use serde_json::{Value, json};
10
11use crate::{
12	ApplicationState::{
13		DTO::WorkspaceFolderStateDTO::WorkspaceFolderStateDTO,
14		State::WorkspaceState::WorkspaceDelta::UpdateWorkspaceFoldersAndNotify,
15	},
16	RunTime::ApplicationRunTime::ApplicationRunTime,
17};
18
19pub async fn WorkspacesGetFolders(RunTime:Arc<ApplicationRunTime>) -> Result<Value, String> {
20	let Workspace = &RunTime.Environment.ApplicationState.Workspace;
21	let Folders = Workspace.GetWorkspaceFolders();
22
23	let FolderList:Vec<Value> = Folders
24		.iter()
25		.enumerate()
26		.map(|(Index, Folder)| {
27			json!({
28				"uri": Folder.URI.to_string(),
29				"name": Folder.Name,
30				"index": Index,
31			})
32		})
33		.collect();
34
35	Ok(json!(FolderList))
36}
37
38pub async fn WorkspacesAddFolder(RunTime:Arc<ApplicationRunTime>, Arguments:Vec<Value>) -> Result<Value, String> {
39	use url::Url;
40
41	let UriStr = Arguments
42		.first()
43		.and_then(|V| V.as_str())
44		.ok_or("workspaces:addFolder requires uri as first argument".to_string())?
45		.to_string();
46
47	let Name = Arguments.get(1).and_then(|V| V.as_str()).unwrap_or("").to_string();
48
49	let Workspace = &RunTime.Environment.ApplicationState.Workspace;
50	let mut Folders = Workspace.GetWorkspaceFolders();
51	let Index = Folders.len();
52	let URI = Url::parse(&UriStr).map_err(|E| format!("workspaces:addFolder invalid URI: {}", E))?;
53	if let Ok(Folder) = WorkspaceFolderStateDTO::New(URI, Name, Index) {
54		Folders.push(Folder);
55		UpdateWorkspaceFoldersAndNotify(Workspace, Folders);
56	}
57
58	Ok(Value::Null)
59}
60
61pub async fn WorkspacesRemoveFolder(RunTime:Arc<ApplicationRunTime>, Arguments:Vec<Value>) -> Result<Value, String> {
62	let UriStr = Arguments
63		.first()
64		.and_then(|V| V.as_str())
65		.ok_or("workspaces:removeFolder requires uri as first argument".to_string())?
66		.to_string();
67
68	let Workspace = &RunTime.Environment.ApplicationState.Workspace;
69	let mut Folders = Workspace.GetWorkspaceFolders();
70	Folders.retain(|F| F.URI.to_string() != UriStr);
71	for (I, F) in Folders.iter_mut().enumerate() {
72		F.Index = I;
73	}
74	UpdateWorkspaceFoldersAndNotify(Workspace, Folders);
75
76	Ok(Value::Null)
77}
78
79pub async fn WorkspacesGetName(RunTime:Arc<ApplicationRunTime>) -> Result<Value, String> {
80	let Name = RunTime
81		.Environment
82		.ApplicationState
83		.Workspace
84		.GetWorkspaceFolders()
85		.into_iter()
86		.next()
87		.map(|F| F.GetDisplayName());
88
89	Ok(Name.map(|N| json!(N)).unwrap_or(Value::Null))
90}