Skip to main content

Mountain/Track/Effect/CreateEffectForRequest/
UserInterface.rs

1#![allow(non_snake_case, unused_variables, dead_code, unused_imports)]
2
3use std::{future::Future, pin::Pin, sync::Arc};
4
5use CommonLibrary::{
6	Environment::Requires::Requires,
7	UserInterface::{DTO::MessageSeverity::MessageSeverity, UserInterfaceProvider::UserInterfaceProvider},
8};
9use serde_json::{Value, json};
10use tauri::Runtime;
11
12use crate::{RunTime::ApplicationRunTime::ApplicationRunTime, Track::Effect::MappedEffectType::MappedEffect, dev_log};
13
14pub fn CreateEffect<R:Runtime>(MethodName:&str, Parameters:Value) -> Option<Result<MappedEffect, String>> {
15	match MethodName {
16		"UserInterface.ShowMessage" => {
17			let effect =
18				move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
19					Box::pin(async move {
20						let provider:Arc<dyn UserInterfaceProvider> = run_time.Environment.Require();
21						let severity_str = Parameters.get(0).and_then(Value::as_str).unwrap_or("info");
22						let message = Parameters.get(1).and_then(Value::as_str).unwrap_or("").to_string();
23						let options = Parameters.get(2).cloned();
24						let severity = match severity_str {
25							"warning" => MessageSeverity::Warning,
26							"error" => MessageSeverity::Error,
27							_ => MessageSeverity::Info,
28						};
29						provider
30							.ShowMessage(severity, message, options)
31							.await
32							.map(|_| json!(null))
33							.map_err(|e| e.to_string())
34					})
35				};
36			Some(Ok(Box::new(effect)))
37		},
38
39		"UserInterface.ShowQuickPick" => {
40			let effect =
41				move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
42					Box::pin(async move {
43						let provider:Arc<dyn UserInterfaceProvider> = run_time.Environment.Require();
44						let (items, options) = (
45							vec![],
46							None as Option<CommonLibrary::UserInterface::DTO::QuickPickOptionsDTO::QuickPickOptionsDTO>,
47						);
48						provider
49							.ShowQuickPick(items, options)
50							.await
51							.map(|selected_items| json!(selected_items))
52							.map_err(|e| e.to_string())
53					})
54				};
55			Some(Ok(Box::new(effect)))
56		},
57
58		"UserInterface.ShowInputBox" => {
59			let effect =
60				move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
61					Box::pin(async move {
62						let provider:Arc<dyn UserInterfaceProvider> = run_time.Environment.Require();
63						let options = if let Some(Value::Object(obj)) = Parameters.get(0) {
64							match serde_json::from_value::<
65								CommonLibrary::UserInterface::DTO::InputBoxOptionsDTO::InputBoxOptionsDTO,
66							>(Value::Object(obj.clone()))
67							{
68								Ok(dto) => Some(dto),
69								Err(e) => {
70									dev_log!("ipc", "warn: Failed to deserialize InputBoxOptionsDTO: {}", e);
71									Some(
72										CommonLibrary::UserInterface::DTO::InputBoxOptionsDTO::InputBoxOptionsDTO::default(),
73									)
74								},
75							}
76						} else {
77							None
78						};
79						provider
80							.ShowInputBox(options)
81							.await
82							.map(|input_opt| json!(input_opt))
83							.map_err(|e| e.to_string())
84					})
85				};
86			Some(Ok(Box::new(effect)))
87		},
88
89		"UserInterface.ShowOpenDialog" => {
90			let effect =
91				move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
92					Box::pin(async move {
93						let provider:Arc<dyn UserInterfaceProvider> = run_time.Environment.Require();
94						let options = if let Some(Value::Object(obj)) = Parameters.get(0) {
95							match serde_json::from_value::<
96								CommonLibrary::UserInterface::DTO::OpenDialogOptionsDTO::OpenDialogOptionsDTO,
97							>(Value::Object(obj.clone()))
98							{
99								Ok(dto) => Some(dto),
100								Err(e) => {
101									dev_log!("ipc", "warn: Failed to deserialize OpenDialogOptionsDTO: {}", e);
102									Some(Default::default())
103								},
104							}
105						} else {
106							None
107						};
108						provider
109							.ShowOpenDialog(options)
110							.await
111							.map(|path_buf_opt| json!(path_buf_opt))
112							.map_err(|e| e.to_string())
113					})
114				};
115			Some(Ok(Box::new(effect)))
116		},
117
118		"UserInterface.ShowSaveDialog" => {
119			let effect =
120				move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
121					Box::pin(async move {
122						let provider:Arc<dyn UserInterfaceProvider> = run_time.Environment.Require();
123						let options = if let Some(Value::Object(obj)) = Parameters.get(0) {
124							match serde_json::from_value::<
125								CommonLibrary::UserInterface::DTO::SaveDialogOptionsDTO::SaveDialogOptionsDTO,
126							>(Value::Object(obj.clone()))
127							{
128								Ok(dto) => Some(dto),
129								Err(e) => {
130									dev_log!("ipc", "warn: Failed to deserialize SaveDialogOptionsDTO: {}", e);
131									Some(Default::default())
132								},
133							}
134						} else {
135							None
136						};
137						provider
138							.ShowSaveDialog(options)
139							.await
140							.map(|path_buf_opt| json!(path_buf_opt))
141							.map_err(|e| e.to_string())
142					})
143				};
144			Some(Ok(Box::new(effect)))
145		},
146
147		_ => None,
148	}
149}