Mountain/Track/Effect/CreateEffectForRequest/
UserInterface.rs1use 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}