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			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}