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 Some(Ok(Box::new(effect)))
23 },
24
25 "$terminal:sendText" => {
26 let effect =
27 move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
28 Box::pin(async move {
29 let provider:Arc<dyn TerminalProvider> = run_time.Environment.Require();
30 let terminal_id = Parameters.get(0).and_then(Value::as_i64).map(|n| n as u64).unwrap_or(0);
31 let text = Parameters.get(1).and_then(Value::as_str).unwrap_or("").to_string();
32 provider
33 .SendTextToTerminal(terminal_id, text)
34 .await
35 .map(|_| json!(null))
36 .map_err(|e| e.to_string())
37 })
38 };
39 Some(Ok(Box::new(effect)))
40 },
41
42 "$terminal:dispose" => {
43 let effect =
44 move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
45 Box::pin(async move {
46 let provider:Arc<dyn TerminalProvider> = run_time.Environment.Require();
47 let terminal_id = Parameters.get(0).and_then(Value::as_i64).map(|n| n as u64).unwrap_or(0);
48 provider
49 .DisposeTerminal(terminal_id)
50 .await
51 .map(|_| json!(null))
52 .map_err(|e| e.to_string())
53 })
54 };
55 Some(Ok(Box::new(effect)))
56 },
57
58 "Terminal.Resize" | "$terminal:resize" => {
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 TerminalProvider> = run_time.Environment.Require();
63 let terminal_id = match Parameters.get(0) {
64 Some(Value::Number(n)) => n.as_u64().unwrap_or(0),
65 Some(Value::String(s)) => {
66 s.rsplit(':').next().and_then(|token| token.parse::<u64>().ok()).unwrap_or(0)
67 },
68 _ => 0,
69 };
70 let cols = Parameters.get(1).and_then(Value::as_u64).map(|n| n as u16).unwrap_or(80);
71 let rows = Parameters.get(2).and_then(Value::as_u64).map(|n| n as u16).unwrap_or(24);
72 provider
73 .ResizeTerminal(terminal_id, cols, rows)
74 .await
75 .map(|()| json!(null))
76 .map_err(|e| e.to_string())
77 })
78 };
79 Some(Ok(Box::new(effect)))
80 },
81
82 "Terminal.GetProcessId" => {
83 let effect =
84 move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
85 Box::pin(async move {
86 use CommonLibrary::{
87 Environment::Requires::Requires,
88 Terminal::TerminalProvider::TerminalProvider,
89 };
90 let Provider:Arc<dyn TerminalProvider> = run_time.Environment.Require();
91 let Handle = Parameters.get(0).cloned().unwrap_or_default();
92 let Id:u64 = if let Some(n) = Handle.as_u64() {
93 n
94 } else if let Some(s) = Handle.as_str() {
95 s.trim_start_matches("terminal:").parse().unwrap_or(0)
96 } else {
97 0
98 };
99 match Provider.GetTerminalProcessId(Id).await {
100 Ok(Some(Pid)) => Ok(json!(Pid)),
101 Ok(None) => Ok(Value::Null),
102 Err(Error) => Err(Error.to_string()),
103 }
104 })
105 };
106 Some(Ok(Box::new(effect)))
107 },
108
109 _ => None,
110 }
111}