Mountain/Vine/Server/Notification/
WindowCreateTerminal.rs1use std::sync::Arc;
9
10use serde_json::{Value, json};
11use tauri::Emitter;
12use CommonLibrary::{Environment::Requires::Requires, Terminal::TerminalProvider::TerminalProvider};
13
14use crate::{Vine::Server::MountainVinegRPCService::MountainVinegRPCService, dev_log};
15
16pub async fn WindowCreateTerminal(Service:&MountainVinegRPCService, Parameter:&Value) {
17 let Provider:Arc<dyn TerminalProvider> = Service.RunTime().Environment.Require();
18
19 let Name = Parameter.get("name").and_then(|V| V.as_str()).unwrap_or("terminal").to_string();
20
21 let Options = Parameter.get("options").cloned().unwrap_or_default();
22
23 let Handle = Parameter
24 .get("handle")
25 .and_then(|V| V.as_str())
26 .map(str::to_string)
27 .unwrap_or_default();
28
29 let AppHandleForTask = Service.ApplicationHandle().clone();
30
31 let NameForTask = Name.clone();
32
33 tokio::spawn(async move {
34 let OptionsPayload = if Options.is_object() {
35 let mut Map = Options.as_object().cloned().unwrap_or_default();
36 Map.entry("name".to_string()).or_insert_with(|| json!(NameForTask));
37 Value::Object(Map)
38 } else {
39 json!({ "name": NameForTask })
40 };
41 if let Ok(Created) = Provider.CreateTerminal(OptionsPayload).await {
42 if let Err(Error) = AppHandleForTask.emit(
43 "sky://terminal/create",
44 json!({
45 "handle": Handle,
46 "id": Created.get("id").cloned().unwrap_or(Value::Null),
47 "pid": Created.get("pid").cloned().unwrap_or(Value::Null),
48 "name": Created.get("name").cloned().unwrap_or(Value::Null),
49 }),
50 ) {
51 dev_log!(
52 "grpc",
53 "warn: [WindowCreateTerminal] sky://terminal/create emit failed: {}",
54 Error
55 );
56 }
57 }
58 });
59}