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