Skip to main content

Vine/Server/Notification/
WindowCreateTerminal.rs

1//! Cocoon → `window.createTerminal` notification.
2//! Spawns a PTY via `VineHost::CreateTerminal`, then emits
3//! `sky://terminal/create` with the provider-minted `{ id, pid, name }`.
4
5use serde_json::{Value, json};
6
7use crate::{Host::VineHost, dev_log};
8
9pub async fn WindowCreateTerminal(Host:&dyn VineHost, Parameter:&Value) {
10	let Handle = Parameter.get("handle").and_then(Value::as_str).unwrap_or("").to_string();
11
12	let Options = Parameter.get("options").cloned().unwrap_or_else(|| Parameter.clone());
13
14	let Name = Options.get("name").and_then(Value::as_str).unwrap_or("Terminal").to_string();
15
16	dev_log!("grpc", "[WindowCreateTerminal] handle={} name={}", Handle, Name);
17
18	let Some(Result) = Host.CreateTerminal(&Options).await else {
19		dev_log!("grpc", "warn: [WindowCreateTerminal] CreateTerminal returned None");
20
21		return;
22	};
23
24	let Id = Result.get("id").and_then(Value::as_u64).unwrap_or(0);
25
26	let Pid = Result.get("pid").and_then(Value::as_u64).unwrap_or(0);
27
28	let ResultName = Result.get("name").and_then(Value::as_str).unwrap_or(&Name).to_string();
29
30	dev_log!("grpc", "[WindowCreateTerminal] created id={} pid={}", Id, Pid);
31
32	Host.EmitToRenderer(
33		"sky://terminal/create",
34		json!({
35			"handle": Handle,
36			"id": Id,
37			"pid": Pid,
38			"name": ResultName,
39		}),
40	);
41}