Mountain/Vine/Server/Notification/
WindowCreateTerminal.rs1#![allow(non_snake_case)]
2use 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}