Skip to main content

Mountain/Vine/Server/Notification/
WindowCreateTerminal.rs

1#![allow(non_snake_case)]
2//! Cocoon → Mountain `window.createTerminal` notification.
3//! Fire-and-forget from Cocoon's `vscode.window.createTerminal(...)`
4//! shim. Spawns the PTY via the registered `TerminalProvider` so the
5//! xterm panel starts receiving data immediately, then emits
6//! `sky://terminal/create` with the provider-minted id/pid/name so Sky
7//! can correlate the panel with the extension-owned terminal instance.
8
9use std::sync::Arc;
10
11use serde_json::{Value, json};
12use tauri::Emitter;
13use CommonLibrary::{Environment::Requires::Requires, Terminal::TerminalProvider::TerminalProvider};
14
15use crate::{Vine::Server::MountainVinegRPCService::MountainVinegRPCService, dev_log};
16
17pub async fn WindowCreateTerminal(Service:&MountainVinegRPCService, Parameter:&Value) {
18	let Provider:Arc<dyn TerminalProvider> = Service.RunTime().Environment.Require();
19
20	let Name = Parameter.get("name").and_then(|V| V.as_str()).unwrap_or("terminal").to_string();
21
22	let Options = Parameter.get("options").cloned().unwrap_or_default();
23
24	let Handle = Parameter
25		.get("handle")
26		.and_then(|V| V.as_str())
27		.map(str::to_string)
28		.unwrap_or_default();
29
30	let AppHandleForTask = Service.ApplicationHandle().clone();
31
32	let NameForTask = Name.clone();
33
34	tokio::spawn(async move {
35		let OptionsPayload = if Options.is_object() {
36			let mut Map = Options.as_object().cloned().unwrap_or_default();
37			Map.entry("name".to_string()).or_insert_with(|| json!(NameForTask));
38			Value::Object(Map)
39		} else {
40			json!({ "name": NameForTask })
41		};
42		if let Ok(Created) = Provider.CreateTerminal(OptionsPayload).await {
43			if let Err(Error) = AppHandleForTask.emit(
44				"sky://terminal/create",
45				json!({
46					"handle": Handle,
47					"id": Created.get("id").cloned().unwrap_or(Value::Null),
48					"pid": Created.get("pid").cloned().unwrap_or(Value::Null),
49					"name": Created.get("name").cloned().unwrap_or(Value::Null),
50				}),
51			) {
52				dev_log!(
53					"grpc",
54					"warn: [WindowCreateTerminal] sky://terminal/create emit failed: {}",
55					Error
56				);
57			}
58		}
59	});
60}