Mountain/Environment/TreeViewProvider/
mod.rs

1//! # TreeViewProvider (Environment)
2//!
3//! Implements the
4//! [`TreeViewProvider`](CommonLibrary::TreeView::TreeViewProvider) trait for
5//! [`MountainEnvironment`](crate::Environment::MountainEnvironment::MountainEnvironment).
6//!
7//! This provider manages the lifecycle of custom tree views and orchestrates
8//! data flow between the extension host (Cocoon) and the UI (Sky). It handles
9//! registration, data dispatching, UI state updates, events, and state
10//! persistence.
11//!
12//! ## Implementation Strategy
13//!
14//! The trait implementation is split across multiple helper modules for
15//! maintainability:
16//! - `Registration`: `RegisterTreeDataProvider`, `UnregisterTreeDataProvider`
17//! - `DataAccess`: `GetChildren`, `GetTreeItem` (dispatcher logic)
18//! - `UIState`: `SetTreeViewMessage`, `SetTreeViewTitle`, `SetTreeViewBadge`
19//! - `Events`: `OnTreeNodeExpanded`, `OnTreeSelectionChanged`
20//! - `StatePersistence`: `PersistTreeViewState`, `RestoreTreeViewState`
21//! - `Visibility`: `RevealTreeItem`, `RefreshTreeView`
22//!
23//! The single `impl TreeViewProvider for MountainEnvironment` block in this
24//! file delegates to those helper functions. This satisfies Rust's orphan rules
25//! while keeping code organized.
26
27use CommonLibrary::TreeView::TreeViewProvider::TreeViewProvider;
28use async_trait::async_trait;
29
30// Private helper modules (not re-exported)
31mod Registration;
32mod DataAccess;
33mod UIState;
34mod Events;
35mod StatePersistence;
36mod Visibility;
37
38#[async_trait]
39impl TreeViewProvider for crate::Environment::MountainEnvironment::MountainEnvironment {
40	async fn RegisterTreeDataProvider(
41		&self,
42		view_identifier:String,
43		options:serde_json::Value,
44	) -> Result<(), CommonLibrary::Error::CommonError::CommonError> {
45		Registration::register_tree_data_provider(self, view_identifier, options).await
46	}
47
48	async fn UnregisterTreeDataProvider(
49		&self,
50		view_identifier:String,
51	) -> Result<(), CommonLibrary::Error::CommonError::CommonError> {
52		Registration::unregister_tree_data_provider(self, view_identifier).await
53	}
54
55	async fn GetChildren(
56		&self,
57		view_identifier:String,
58		element_handle:Option<String>,
59	) -> Result<Vec<serde_json::Value>, CommonLibrary::Error::CommonError::CommonError> {
60		DataAccess::get_children(self, view_identifier, element_handle).await
61	}
62
63	async fn GetTreeItem(
64		&self,
65		view_identifier:String,
66		element_handle:String,
67	) -> Result<serde_json::Value, CommonLibrary::Error::CommonError::CommonError> {
68		DataAccess::get_tree_item(self, view_identifier, element_handle).await
69	}
70
71	async fn SetTreeViewMessage(
72		&self,
73		view_identifier:String,
74		message:Option<String>,
75	) -> Result<(), CommonLibrary::Error::CommonError::CommonError> {
76		UIState::set_tree_view_message(self, view_identifier, message).await
77	}
78
79	async fn SetTreeViewTitle(
80		&self,
81		view_identifier:String,
82		title:Option<String>,
83		description:Option<String>,
84	) -> Result<(), CommonLibrary::Error::CommonError::CommonError> {
85		UIState::set_tree_view_title(self, view_identifier, title, description).await
86	}
87
88	async fn SetTreeViewBadge(
89		&self,
90		view_identifier:String,
91		badge:Option<serde_json::Value>,
92	) -> Result<(), CommonLibrary::Error::CommonError::CommonError> {
93		UIState::set_tree_view_badge(self, view_identifier, badge).await
94	}
95
96	async fn OnTreeNodeExpanded(
97		&self,
98		view_identifier:String,
99		element_handle:String,
100		is_expanded:bool,
101	) -> Result<(), CommonLibrary::Error::CommonError::CommonError> {
102		Events::on_tree_node_expanded(self, view_identifier, element_handle, is_expanded).await
103	}
104
105	async fn OnTreeSelectionChanged(
106		&self,
107		view_identifier:String,
108		selected_handles:Vec<String>,
109	) -> Result<(), CommonLibrary::Error::CommonError::CommonError> {
110		Events::on_tree_selection_changed(self, view_identifier, selected_handles).await
111	}
112
113	async fn PersistTreeViewState(
114		&self,
115		view_identifier:String,
116	) -> Result<serde_json::Value, CommonLibrary::Error::CommonError::CommonError> {
117		StatePersistence::persist_tree_view_state(self, view_identifier).await
118	}
119
120	async fn RestoreTreeViewState(
121		&self,
122		view_identifier:String,
123		state_value:serde_json::Value,
124	) -> Result<(), CommonLibrary::Error::CommonError::CommonError> {
125		StatePersistence::restore_tree_view_state(self, view_identifier, state_value).await
126	}
127
128	async fn RevealTreeItem(
129		&self,
130		view_identifier:String,
131		item_handle:String,
132		options:serde_json::Value,
133	) -> Result<(), CommonLibrary::Error::CommonError::CommonError> {
134		Visibility::reveal_tree_item(self, view_identifier, item_handle, options).await
135	}
136
137	async fn RefreshTreeView(
138		&self,
139		view_identifier:String,
140		items_to_refresh:Option<serde_json::Value>,
141	) -> Result<(), CommonLibrary::Error::CommonError::CommonError> {
142		Visibility::refresh_tree_view(self, view_identifier, items_to_refresh).await
143	}
144}