Skip to main content

Mountain/IPC/WindServiceHandlers/UI/
WorkspacesAddFolder.rs

1//! Wire method: `workspaces:addFolder`.
2
3use std::sync::Arc;
4
5use serde_json::Value;
6
7use crate::{
8	ApplicationState::{
9		DTO::WorkspaceFolderStateDTO::WorkspaceFolderStateDTO,
10		State::WorkspaceState::WorkspaceDelta::UpdateWorkspaceFoldersAndNotify,
11	},
12	IPC::WindServiceHandlers::Utilities::JsonValueHelpers::arg_string,
13	RunTime::ApplicationRunTime::ApplicationRunTime,
14};
15
16pub async fn Fn(RunTime:Arc<ApplicationRunTime>, Arguments:Vec<Value>) -> Result<Value, String> {
17	use url::Url;
18
19	let UriStr = Arguments
20		.first()
21		.and_then(|V| V.as_str())
22		.ok_or("workspaces:addFolder requires uri as first argument".to_string())?
23		.to_string();
24
25	let Name = arg_string(&Arguments, 1);
26
27	let Workspace = &RunTime.Environment.ApplicationState.Workspace;
28
29	let mut Folders = Workspace.GetWorkspaceFolders();
30
31	let Index = Folders.len();
32
33	let URI = Url::parse(&UriStr).map_err(|E| format!("workspaces:addFolder invalid URI: {}", E))?;
34
35	if let Ok(Folder) = WorkspaceFolderStateDTO::New(URI, Name, Index) {
36		Folders.push(Folder);
37
38		UpdateWorkspaceFoldersAndNotify(Workspace, Folders);
39	}
40
41	Ok(Value::Null)
42}