Skip to main content

Mountain/Track/Effect/CreateEffectForRequest/
Commands.rs

1#![allow(non_snake_case, unused_variables, dead_code, unused_imports)]
2
3use std::{future::Future, pin::Pin, sync::Arc};
4
5use CommonLibrary::{Command::CommandExecutor::CommandExecutor, Environment::Requires::Requires};
6use serde_json::{Value, json};
7use tauri::Runtime;
8
9use crate::{RunTime::ApplicationRunTime::ApplicationRunTime, Track::Effect::MappedEffectType::MappedEffect};
10
11pub fn CreateEffect<R:Runtime>(MethodName:&str, Parameters:Value) -> Option<Result<MappedEffect, String>> {
12	match MethodName {
13		"executeCommand" => {
14			let effect =
15				move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
16					Box::pin(async move {
17						let command_executor:Arc<dyn CommandExecutor> = run_time.Environment.Require();
18						let (command_id, args) = if let Some(Object) = Parameters.as_object() {
19							let Id = Object
20								.get("command")
21								.or_else(|| Object.get("commandId"))
22								.and_then(Value::as_str)
23								.unwrap_or("")
24								.to_string();
25							let A = Object
26								.get("args")
27								.cloned()
28								.unwrap_or_else(|| Object.get("arguments").cloned().unwrap_or_default());
29							(Id, A)
30						} else {
31							let Id = Parameters.get(0).and_then(Value::as_str).unwrap_or("").to_string();
32							let A = Parameters.get(1).cloned().unwrap_or_default();
33							(Id, A)
34						};
35						command_executor
36							.ExecuteCommand(command_id, args)
37							.await
38							.map_err(|e| e.to_string())
39					})
40				};
41
42			Some(Ok(Box::new(effect)))
43		},
44
45		"Command.Execute" => {
46			let effect =
47				move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
48					Box::pin(async move {
49						let command_executor:Arc<dyn CommandExecutor> = run_time.Environment.Require();
50						let command_id = Parameters.get(0).and_then(Value::as_str).unwrap_or("").to_string();
51						let args = Parameters.get(1).cloned().unwrap_or_default();
52						command_executor
53							.ExecuteCommand(command_id, args)
54							.await
55							.map_err(|e| e.to_string())
56					})
57				};
58
59			Some(Ok(Box::new(effect)))
60		},
61
62		"Command.GetAll" => {
63			let effect =
64				move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
65					Box::pin(async move {
66						let provider:Arc<dyn CommandExecutor> = run_time.Environment.Require();
67						provider
68							.GetAllCommands()
69							.await
70							.map(|cmds| json!(cmds))
71							.map_err(|e| e.to_string())
72					})
73				};
74
75			Some(Ok(Box::new(effect)))
76		},
77
78		_ => None,
79	}
80}