Skip to main content

Mountain/Track/Effect/CreateEffectForRequest/
TreeView.rs

1#![allow(non_snake_case, unused_variables, dead_code, unused_imports)]
2
3use std::{future::Future, pin::Pin, sync::Arc};
4
5use CommonLibrary::{
6	Environment::Requires::Requires,
7	IPC::SkyEvent::SkyEvent,
8	TreeView::TreeViewProvider::TreeViewProvider,
9};
10use serde_json::{Value, json};
11use tauri::Runtime;
12
13use crate::{
14	IPC::SkyEmit::LogSkyEmit,
15	RunTime::ApplicationRunTime::ApplicationRunTime,
16	Track::Effect::MappedEffectType::MappedEffect,
17	dev_log,
18};
19
20pub fn CreateEffect<R:Runtime>(MethodName:&str, Parameters:Value) -> Option<Result<MappedEffect, String>> {
21	match MethodName {
22		"$tree:register" | "tree.register" => {
23			let DispatchEnterNs = std::time::SystemTime::now()
24				.duration_since(std::time::UNIX_EPOCH)
25				.map(|D| D.as_nanos())
26				.unwrap_or(0);
27			dev_log!(
28				"tree-latency",
29				"[LandFix:Tree] dispatch-enter method={} t_ns={}",
30				MethodName,
31				DispatchEnterNs
32			);
33
34			let effect =
35				move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
36					Box::pin(async move {
37						let DispatchAt = std::time::Instant::now();
38						let BodyStartNs = std::time::SystemTime::now()
39							.duration_since(std::time::UNIX_EPOCH)
40							.map(|D| D.as_nanos())
41							.unwrap_or(0);
42						let provider:Arc<dyn TreeViewProvider> = run_time.Environment.Require();
43						let first = Parameters.get(0).and_then(Value::as_str).unwrap_or("");
44						let (view_id, options) = if Parameters.get(2).is_some() {
45							let vid = Parameters.get(1).and_then(Value::as_str).unwrap_or(first).to_string();
46							let opts = Parameters.get(2).cloned().unwrap_or_default();
47							(vid, opts)
48						} else {
49							let vid = first.to_string();
50							let opts = Parameters.get(1).cloned().unwrap_or_default();
51							(vid, opts)
52						};
53						let ViewIdForLog = view_id.clone();
54						dev_log!("grpc", "[LandFix:Tree] body-start view={} t_ns={}", ViewIdForLog, BodyStartNs);
55						let Result = provider.RegisterTreeDataProvider(view_id.clone(), options.clone()).await;
56						let RegisteredNs = std::time::SystemTime::now()
57							.duration_since(std::time::UNIX_EPOCH)
58							.map(|D| D.as_nanos())
59							.unwrap_or(0);
60						dev_log!(
61							"grpc",
62							"[LandFix:Tree] registered view={} elapsed={}ms t_ns={}",
63							ViewIdForLog,
64							DispatchAt.elapsed().as_millis(),
65							RegisteredNs
66						);
67						dev_log!(
68							"tree-view",
69							"[TreeView] register view={} result={} elapsed={}ms",
70							ViewIdForLog,
71							if Result.is_ok() { "ok" } else { "err" },
72							DispatchAt.elapsed().as_millis()
73						);
74
75						// Notify Wind/Sky that a data provider now exists for this
76						// view, so the renderer can set `treeView.dataProvider` on
77						// the matching ITreeView instance and replace the default
78						// "no data provider registered" message. Without this
79						// emit, `vs/workbench/browser/parts/views/treeView.ts`
80						// keeps `_dataProvider === undefined` and every extension
81						// tree view stays empty (GitLens, debug, SCM, tasks, etc.).
82						if Result.is_ok() {
83							// Routes through `LogSkyEmit` so every emit also
84							// surfaces under the `sky-emit` tag in addition to
85							// the existing `tree-view` diagnostic. Failure
86							// reason stays surfaced via both tags.
87							match LogSkyEmit(
88								&run_time.Environment.ApplicationHandle,
89								SkyEvent::TreeViewCreate.AsStr(),
90								json!({
91									"viewId": view_id,
92									"options": options,
93								}),
94							) {
95								Ok(()) => {
96									dev_log!(
97										"tree-view",
98										"[TreeView] emit-ok channel={} view={}",
99										SkyEvent::TreeViewCreate.AsStr(),
100										ViewIdForLog
101									);
102								},
103								Err(Error) => {
104									dev_log!(
105										"grpc",
106										"warn: [LandFix:Tree] failed to emit {} for view={}: {}",
107										SkyEvent::TreeViewCreate.AsStr(),
108										ViewIdForLog,
109										Error
110									);
111									dev_log!(
112										"tree-view",
113										"[TreeView] emit-fail channel={} view={} error={}",
114										SkyEvent::TreeViewCreate.AsStr(),
115										ViewIdForLog,
116										Error
117									);
118								},
119							}
120						}
121
122						Result.map(|_| json!(null)).map_err(|e| e.to_string())
123					})
124				};
125			Some(Ok(Box::new(effect)))
126		},
127
128		"tree.unregister" | "tree.dispose" => {
129			let effect =
130				move |_run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
131					Box::pin(async move {
132						let handle = Parameters.get(0).and_then(Value::as_str).unwrap_or("");
133						dev_log!("ipc", "[tree.unregister] handle={}", handle);
134						Ok(json!(null))
135					})
136				};
137			Some(Ok(Box::new(effect)))
138		},
139
140		_ => None,
141	}
142}