Skip to main content

Mountain/Track/Effect/CreateEffectForRequest/
UserInterface.rs

1//! # UserInterface Effect (CreateEffectForRequest)
2//!
3//! Effect constructors for user-interface dialog methods. Delegates to the
4//! `UserInterfaceProvider` trait on `MountainEnvironment` for all UI
5//! interactions.
6//!
7//! ## Methods handled
8//!
9//! | Method | Description |
10//! |---|---|
11//! | `UserInterface.ShowMessage` | Show a notification with optional severity |
12//! | `UserInterface.ShowQuickPick` | Display a quick-pick selection list |
13//! | `UserInterface.ShowInputBox` | Display a text input dialog |
14//! | `UserInterface.ShowOpenDialog` | Display a file/folder picker dialog |
15//! | `UserInterface.ShowSaveDialog` | Display a save file dialog |
16
17use std::sync::Arc;
18
19use CommonLibrary::{
20	Environment::Requires::Requires,
21	UserInterface::{DTO::MessageSeverity::MessageSeverity, UserInterfaceProvider::UserInterfaceProvider},
22};
23use serde_json::{Value, json};
24use tauri::Runtime;
25
26use crate::{
27	RunTime::ApplicationRunTime::ApplicationRunTime,
28	Track::Effect::{
29		CreateEffectForRequest::Utilities::Params::{string_at, string_at_or},
30		MappedEffectType::MappedEffect,
31	},
32	dev_log,
33};
34
35pub fn CreateEffect<R:Runtime>(MethodName:&str, Parameters:Value) -> Option<Result<MappedEffect, String>> {
36	match MethodName {
37		"UserInterface.ShowMessage" => {
38			crate::effect!(run_time, {
39				let provider:Arc<dyn UserInterfaceProvider> = run_time.Environment.Require();
40
41				let severity_str = string_at_or(&Parameters, 0, "info");
42
43				let message = string_at(&Parameters, 1);
44
45				let options = Parameters.get(2).cloned();
46
47				let severity = match severity_str.as_str() {
48					"warning" => MessageSeverity::Warning,
49					"error" => MessageSeverity::Error,
50					_ => MessageSeverity::Info,
51				};
52
53				provider
54					.ShowMessage(severity, message, options)
55					.await
56					.map(|_| json!(null))
57					.map_err(|e| e.to_string())
58			})
59		},
60
61		"UserInterface.ShowQuickPick" => {
62			crate::effect!(run_time, {
63				let provider:Arc<dyn UserInterfaceProvider> = run_time.Environment.Require();
64
65				let items = Parameters
66					.get(0)
67					.and_then(Value::as_array)
68					.cloned()
69					.unwrap_or_default()
70					.into_iter()
71					.filter_map(|v| {
72						serde_json::from_value::<CommonLibrary::UserInterface::DTO::QuickPickItemDTO::QuickPickItemDTO>(
73							v,
74						)
75						.ok()
76					})
77					.collect::<Vec<_>>();
78
79				let options = Parameters.get(1).and_then(|V| {
80					if V.is_object() {
81						match serde_json::from_value::<
82							CommonLibrary::UserInterface::DTO::QuickPickOptionsDTO::QuickPickOptionsDTO,
83						>(V.clone())
84						{
85							Ok(dto) => Some(dto),
86							Err(e) => {
87								dev_log!("ipc", "warn: Failed to deserialize QuickPickOptionsDTO: {}", e);
88
89								Some(Default::default())
90							},
91						}
92					} else {
93						None
94					}
95				});
96
97				provider
98					.ShowQuickPick(items, options)
99					.await
100					.map(|selected_items| json!(selected_items))
101					.map_err(|e| e.to_string())
102			})
103		},
104
105		"UserInterface.ShowInputBox" => {
106			crate::effect!(run_time, {
107				let provider:Arc<dyn UserInterfaceProvider> = run_time.Environment.Require();
108
109				let options = if let Some(Value::Object(obj)) = Parameters.get(0) {
110					match serde_json::from_value::<
111						CommonLibrary::UserInterface::DTO::InputBoxOptionsDTO::InputBoxOptionsDTO,
112					>(Value::Object(obj.clone()))
113					{
114						Ok(dto) => Some(dto),
115						Err(e) => {
116							dev_log!("ipc", "warn: Failed to deserialize InputBoxOptionsDTO: {}", e);
117
118							Some(CommonLibrary::UserInterface::DTO::InputBoxOptionsDTO::InputBoxOptionsDTO::default())
119						},
120					}
121				} else {
122					None
123				};
124
125				provider
126					.ShowInputBox(options)
127					.await
128					.map(|input_opt| json!(input_opt))
129					.map_err(|e| e.to_string())
130			})
131		},
132
133		"UserInterface.ShowOpenDialog" => {
134			crate::effect!(run_time, {
135				let provider:Arc<dyn UserInterfaceProvider> = run_time.Environment.Require();
136
137				let options = if let Some(Value::Object(obj)) = Parameters.get(0) {
138					match serde_json::from_value::<
139						CommonLibrary::UserInterface::DTO::OpenDialogOptionsDTO::OpenDialogOptionsDTO,
140					>(Value::Object(obj.clone()))
141					{
142						Ok(dto) => Some(dto),
143						Err(e) => {
144							dev_log!("ipc", "warn: Failed to deserialize OpenDialogOptionsDTO: {}", e);
145
146							Some(Default::default())
147						},
148					}
149				} else {
150					None
151				};
152
153				provider
154					.ShowOpenDialog(options)
155					.await
156					.map(|path_buf_opt| json!(path_buf_opt))
157					.map_err(|e| e.to_string())
158			})
159		},
160
161		"UserInterface.ShowSaveDialog" => {
162			crate::effect!(run_time, {
163				let provider:Arc<dyn UserInterfaceProvider> = run_time.Environment.Require();
164
165				let options = if let Some(Value::Object(obj)) = Parameters.get(0) {
166					match serde_json::from_value::<
167						CommonLibrary::UserInterface::DTO::SaveDialogOptionsDTO::SaveDialogOptionsDTO,
168					>(Value::Object(obj.clone()))
169					{
170						Ok(dto) => Some(dto),
171						Err(e) => {
172							dev_log!("ipc", "warn: Failed to deserialize SaveDialogOptionsDTO: {}", e);
173
174							Some(Default::default())
175						},
176					}
177				} else {
178					None
179				};
180
181				provider
182					.ShowSaveDialog(options)
183					.await
184					.map(|path_buf_opt| json!(path_buf_opt))
185					.map_err(|e| e.to_string())
186			})
187		},
188
189		_ => None,
190	}
191}