Mountain/Environment/TreeViewProvider/
DataAccess.rs

1//! # Tree View Data Access Helpers
2//!
3//! Internal helper functions for fetching tree data (children, tree items).
4
5use std::sync::Arc;
6
7use CommonLibrary::{
8	Environment::Requires::Requires,
9	Error::CommonError::CommonError,
10	IPC::{self, DTO::ProxyTarget::ProxyTarget, IPCProvider::IPCProvider},
11};
12use log::debug;
13use serde_json::Value;
14
15use crate::Environment::Utility;
16
17/// Gets the children for a given element.
18/// Acts as a dispatcher to native or extension providers.
19pub(super) async fn get_children(
20	env:&crate::Environment::MountainEnvironment::MountainEnvironment,
21	view_identifier:String,
22	element_handle:Option<String>,
23) -> Result<Vec<Value>, CommonError> {
24	debug!(
25		"[TreeViewProvider] Getting children for view '{}', handle: {:?}",
26		view_identifier, element_handle
27	);
28
29	let provider_info = env
30		.ApplicationState
31		.Feature
32		.TreeViews
33		.ActiveTreeViews
34		.lock()
35		.map_err(Utility::MapApplicationStateLockErrorToCommonError)?
36		.get(&view_identifier)
37		.cloned();
38
39	if let Some(info) = provider_info {
40		if let Some(native_provider) = info.Provider {
41			// Case 1: Native Rust provider (e.g., File Explorer)
42			return native_provider.GetChildren(view_identifier, element_handle).await;
43		} else if let Some(side_car_id) = info.SideCarIdentifier {
44			// Case 2: Proxied extension provider
45			let ipc_provider:Arc<dyn IPCProvider> = env.Require();
46
47			let rpc_method = format!("{}$getChildren", ProxyTarget::ExtHostTreeView.GetTargetPrefix());
48
49			let rpc_params = serde_json::json!([view_identifier, element_handle]);
50
51			let response = ipc_provider
52				.SendRequestToSideCar(side_car_id, rpc_method, rpc_params, 10000)
53				.await?;
54
55			return serde_json::from_value::<Vec<Value>>(response).map_err(CommonError::from);
56		}
57	}
58	Err(CommonError::TreeViewProviderNotFound { ViewIdentifier:view_identifier })
59}
60
61/// Gets the TreeItem for a given element.
62/// Acts as a dispatcher to native or extension providers.
63pub(super) async fn get_tree_item(
64	env:&crate::Environment::MountainEnvironment::MountainEnvironment,
65	view_identifier:String,
66	element_handle:String,
67) -> Result<Value, CommonError> {
68	debug!(
69		"[TreeViewProvider] Getting item for view '{}', handle: {}",
70		view_identifier, element_handle
71	);
72
73	let provider_info = env
74		.ApplicationState
75		.Feature
76		.TreeViews
77		.ActiveTreeViews
78		.lock()
79		.map_err(Utility::MapApplicationStateLockErrorToCommonError)?
80		.get(&view_identifier)
81		.cloned();
82
83	if let Some(info) = provider_info {
84		if let Some(native_provider) = info.Provider {
85			return native_provider.GetTreeItem(view_identifier, element_handle).await;
86		} else if let Some(side_car_id) = info.SideCarIdentifier {
87			let ipc_provider:Arc<dyn IPCProvider> = env.Require();
88
89			let rpc_method = format!("{}$getTreeItem", ProxyTarget::ExtHostTreeView.GetTargetPrefix());
90
91			let rpc_params = serde_json::json!([view_identifier, element_handle]);
92
93			return ipc_provider
94				.SendRequestToSideCar(side_car_id, rpc_method, rpc_params, 5000)
95				.await;
96		}
97	}
98	Err(CommonError::TreeViewProviderNotFound { ViewIdentifier:view_identifier })
99}