Skip to main content

Mountain/Track/Effect/CreateEffectForRequest/
Terminal.rs

1#![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}