Mountain/Track/Effect/CreateEffectForRequest/
TreeView.rs1#![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 if Result.is_ok() {
83 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}