Skip to main content

Mountain/Track/Effect/CreateEffectForRequest/
TreeView.rs

1#![allow(unused_variables, dead_code, unused_imports)]
2
3//! Effect constructors for tree-view registration and disposal from the
4//! Cocoon extension host. Delegates to `TreeViewProvider` on
5//! `MountainEnvironment` and emits `SkyEvent` notifications to keep the
6//! Sky workbench's `ITreeView` instances in sync.
7
8use std::{future::Future, pin::Pin, sync::Arc};
9
10use CommonLibrary::{
11	Environment::Requires::Requires,
12	IPC::SkyEvent::SkyEvent,
13	TreeView::TreeViewProvider::TreeViewProvider,
14};
15use serde_json::{Value, json};
16use tauri::Runtime;
17
18use crate::{
19	IPC::SkyEmit::LogSkyEmit,
20	RunTime::ApplicationRunTime::ApplicationRunTime,
21	Track::Effect::MappedEffectType::MappedEffect,
22	dev_log,
23};
24
25pub fn CreateEffect<R:Runtime>(MethodName:&str, Parameters:Value) -> Option<Result<MappedEffect, String>> {
26	match MethodName {
27		"$tree:register" | "tree.register" => {
28			let effect =
29				move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
30					Box::pin(async move {
31						let provider:Arc<dyn TreeViewProvider> = run_time.Environment.Require();
32
33						let first = Parameters.get(0).and_then(Value::as_str).unwrap_or("");
34
35						let (ViewId, Options) = if Parameters.get(2).is_some() {
36							let vid = Parameters.get(1).and_then(Value::as_str).unwrap_or(first).to_string();
37							let opts = Parameters.get(2).cloned().unwrap_or_default();
38							(vid, opts)
39						} else {
40							let vid = first.to_string();
41							let opts = Parameters.get(1).cloned().unwrap_or_default();
42							(vid, opts)
43						};
44
45						dev_log!("tree-view", "[TreeView] register view={}", ViewId);
46
47						let Result = provider.RegisterTreeDataProvider(ViewId.clone(), Options.clone()).await;
48
49						dev_log!(
50							"tree-view",
51							"[TreeView] register view={} result={}",
52							ViewId,
53							if Result.is_ok() { "ok" } else { "err" }
54						);
55
56						if Result.is_ok() {
57							if let Err(Error) = LogSkyEmit(
58								&run_time.Environment.ApplicationHandle,
59								SkyEvent::TreeViewCreate.AsStr(),
60								json!({ "viewId": ViewId, "options": Options }),
61							) {
62								dev_log!("tree-view", "warn: [TreeView] emit failed view={}: {}", ViewId, Error);
63							}
64						}
65
66						Result.map(|_| json!(null)).map_err(|E| E.to_string())
67					})
68				};
69
70			Some(Ok(Box::new(effect)))
71		},
72
73		"tree.unregister" | "tree.dispose" => {
74			let effect =
75				move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
76					Box::pin(async move {
77						let ViewId = Parameters.get(0).and_then(Value::as_str).unwrap_or("").to_string();
78
79						if ViewId.is_empty() {
80							return Ok(json!(null));
81						}
82
83						dev_log!("tree-view", "[TreeView] unregister view={}", ViewId);
84
85						let provider:Arc<dyn TreeViewProvider> = run_time.Environment.Require();
86
87						let Result = provider.UnregisterTreeDataProvider(ViewId.clone()).await;
88
89						if Result.is_ok() {
90							if let Err(Error) = LogSkyEmit(
91								&run_time.Environment.ApplicationHandle,
92								SkyEvent::TreeViewDispose.AsStr(),
93								json!({ "viewId": ViewId }),
94							) {
95								dev_log!(
96									"tree-view",
97									"warn: [TreeView] dispose emit failed view={}: {}",
98									ViewId,
99									Error
100								);
101							}
102						}
103
104						Result.map(|_| json!(null)).map_err(|E| E.to_string())
105					})
106				};
107
108			Some(Ok(Box::new(effect)))
109		},
110
111		_ => None,
112	}
113}