Mountain/Track/Effect/CreateEffectForRequest/
UserInterface.rs1#![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}