Mountain/Environment/TreeViewProvider/
StatePersistence.rs1use CommonLibrary::{Error::CommonError::CommonError, IPC::SkyEvent::SkyEvent};
6use serde_json::json;
7use tauri::Emitter;
8
9use crate::{Environment::Utility, dev_log};
10
11pub(super) async fn persist_tree_view_state(
14 env:&crate::Environment::MountainEnvironment::MountainEnvironment,
15
16 view_identifier:String,
17) -> Result<serde_json::Value, CommonError> {
18 dev_log!(
19 "extensions",
20 "[TreeViewProvider] Persisting state for view '{}'",
21 view_identifier
22 );
23
24 let tree_views = env
25 .ApplicationState
26 .Feature
27 .TreeViews
28 .ActiveTreeViews
29 .lock()
30 .map_err(Utility::ErrorMapping::MapApplicationStateLockErrorToCommonError)?;
31
32 let state = tree_views.get(&view_identifier).map(|view| {
33 json!({
34 "ViewIdentifier": view_identifier,
35 "Title": view.Title,
36 "Description": view.Description,
37 "CanSelectMany": view.CanSelectMany,
38 "Message": view.Message,
39 "HasHandleDrag": view.HasHandleDrag,
40 "HasHandleDrop": view.HasHandleDrop,
41 })
42 });
43
44 state.ok_or(CommonError::TreeViewProviderNotFound { ViewIdentifier:view_identifier })
45}
46
47pub(super) async fn restore_tree_view_state(
50 env:&crate::Environment::MountainEnvironment::MountainEnvironment,
51
52 view_identifier:String,
53
54 state_value:serde_json::Value,
55) -> Result<(), CommonError> {
56 dev_log!(
57 "extensions",
58 "[TreeViewProvider] Restoring state for view '{}'",
59 view_identifier
60 );
61
62 let mut tree_views = env
63 .ApplicationState
64 .Feature
65 .TreeViews
66 .ActiveTreeViews
67 .lock()
68 .map_err(Utility::ErrorMapping::MapApplicationStateLockErrorToCommonError)?;
69
70 if let Some(view_state) = tree_views.get_mut(&view_identifier) {
71 if let Some(title) = state_value.get("Title").and_then(|v| v.as_str()) {
72 view_state.Title = Some(title.to_string());
73 }
74
75 if let Some(description) = state_value.get("Description").and_then(|v| v.as_str()) {
76 view_state.Description = Some(description.to_string());
77 }
78
79 env.ApplicationHandle
88 .emit(
89 SkyEvent::TreeViewRestoreState.AsStr(),
90 json!({
91 "viewId": view_identifier,
92 "state": state_value
93 }),
94 )
95 .map_err(|Error| {
96 CommonError::UserInterfaceInteraction {
97 Reason:format!("Failed to emit restore state event: {}", Error),
98 }
99 })?;
100
101 Ok(())
102 } else {
103 Err(CommonError::TreeViewProviderNotFound { ViewIdentifier:view_identifier })
104 }
105}