Skip to main content

Mountain/Track/Effect/CreateEffectForRequest/
Terminal.rs

1#![allow(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		// `$terminal:show` / `$terminal:hide` - Cocoon's window namespace shim
115		// calls these when extensions invoke `terminal.show(preserveFocus)` or
116		// `terminal.hide()`. Wire through the same `ShowTerminal` / `HideTerminal`
117		// provider path that the `terminal:show` / `terminal:hide` IPC handlers
118		// use so both call sites share one implementation.
119		"$terminal:show" | "Terminal.Show" => {
120			let effect =
121				move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
122					Box::pin(async move {
123						let provider:Arc<dyn TerminalProvider> = run_time.Environment.Require();
124						let terminal_id = Parameters.get(0).and_then(Value::as_u64).unwrap_or(0);
125						let preserve_focus = Parameters.get(1).and_then(Value::as_bool).unwrap_or(false);
126						provider
127							.ShowTerminal(terminal_id, preserve_focus)
128							.await
129							.map(|()| json!(null))
130							.map_err(|e| e.to_string())
131					})
132				};
133
134			Some(Ok(Box::new(effect)))
135		},
136
137		"$terminal:hide" | "Terminal.Hide" => {
138			let effect =
139				move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
140					Box::pin(async move {
141						let provider:Arc<dyn TerminalProvider> = run_time.Environment.Require();
142						let terminal_id = Parameters.get(0).and_then(Value::as_u64).unwrap_or(0);
143						provider
144							.HideTerminal(terminal_id)
145							.await
146							.map(|()| json!(null))
147							.map_err(|e| e.to_string())
148					})
149				};
150
151			Some(Ok(Box::new(effect)))
152		},
153
154		_ => None,
155	}
156}