Skip to main content

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