Mountain/IPC/WindServiceHandlers/UI/
Workspace.rs1#![allow(non_snake_case, unused_variables)]
2use 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}