Mountain/Track/Effect/CreateEffectForRequest/
Terminal.rs1#![allow(non_snake_case, unused_variables, dead_code, unused_imports)]
2
3use std::{future::Future, pin::Pin, sync::Arc};
4
5use CommonLibrary::{Environment::Requires::Requires, Terminal::TerminalProvider::TerminalProvider};
6use serde_json::{Value, json};
7use tauri::Runtime;
8
9use crate::{RunTime::ApplicationRunTime::ApplicationRunTime, Track::Effect::MappedEffectType::MappedEffect, dev_log};
10
11pub fn CreateEffect<R:Runtime>(MethodName:&str, Parameters:Value) -> Option<Result<MappedEffect, String>> {
12 match MethodName {
13 "$terminal:create" => {
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 provider:Arc<dyn TerminalProvider> = run_time.Environment.Require();
18 let options = Parameters.get(0).cloned().unwrap_or_default();
19 provider.CreateTerminal(options).await.map_err(|e| e.to_string())
20 })
21 };
22
23 Some(Ok(Box::new(effect)))
24 },
25
26 "$terminal:sendText" => {
27 let effect =
28 move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
29 Box::pin(async move {
30 let provider:Arc<dyn TerminalProvider> = run_time.Environment.Require();
31 let terminal_id = Parameters.get(0).and_then(Value::as_i64).map(|n| n as u64).unwrap_or(0);
32 let text = Parameters.get(1).and_then(Value::as_str).unwrap_or("").to_string();
33 provider
34 .SendTextToTerminal(terminal_id, text)
35 .await
36 .map(|_| json!(null))
37 .map_err(|e| e.to_string())
38 })
39 };
40
41 Some(Ok(Box::new(effect)))
42 },
43
44 "$terminal:dispose" => {
45 let effect =
46 move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
47 Box::pin(async move {
48 let provider:Arc<dyn TerminalProvider> = run_time.Environment.Require();
49 let terminal_id = Parameters.get(0).and_then(Value::as_i64).map(|n| n as u64).unwrap_or(0);
50 provider
51 .DisposeTerminal(terminal_id)
52 .await
53 .map(|_| json!(null))
54 .map_err(|e| e.to_string())
55 })
56 };
57
58 Some(Ok(Box::new(effect)))
59 },
60
61 "Terminal.Resize" | "$terminal:resize" => {
62 let effect =
63 move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
64 Box::pin(async move {
65 let provider:Arc<dyn TerminalProvider> = run_time.Environment.Require();
66 let terminal_id = match Parameters.get(0) {
67 Some(Value::Number(n)) => n.as_u64().unwrap_or(0),
68 Some(Value::String(s)) => {
69 s.rsplit(':').next().and_then(|token| token.parse::<u64>().ok()).unwrap_or(0)
70 },
71 _ => 0,
72 };
73 let cols = Parameters.get(1).and_then(Value::as_u64).map(|n| n as u16).unwrap_or(80);
74 let rows = Parameters.get(2).and_then(Value::as_u64).map(|n| n as u16).unwrap_or(24);
75 provider
76 .ResizeTerminal(terminal_id, cols, rows)
77 .await
78 .map(|()| json!(null))
79 .map_err(|e| e.to_string())
80 })
81 };
82
83 Some(Ok(Box::new(effect)))
84 },
85
86 "Terminal.GetProcessId" => {
87 let effect =
88 move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
89 Box::pin(async move {
90 use CommonLibrary::{
91 Environment::Requires::Requires,
92 Terminal::TerminalProvider::TerminalProvider,
93 };
94 let Provider:Arc<dyn TerminalProvider> = run_time.Environment.Require();
95 let Handle = Parameters.get(0).cloned().unwrap_or_default();
96 let Id:u64 = if let Some(n) = Handle.as_u64() {
97 n
98 } else if let Some(s) = Handle.as_str() {
99 s.trim_start_matches("terminal:").parse().unwrap_or(0)
100 } else {
101 0
102 };
103 match Provider.GetTerminalProcessId(Id).await {
104 Ok(Some(Pid)) => Ok(json!(Pid)),
105 Ok(None) => Ok(Value::Null),
106 Err(Error) => Err(Error.to_string()),
107 }
108 })
109 };
110
111 Some(Ok(Box::new(effect)))
112 },
113
114 _ => None,
115 }
116}