Mountain/ApplicationState/State/FeatureState/Markers/
MarkerState.rs

1//! # MarkerState Module (ApplicationState)
2//!
3//! ## RESPONSIBILITIES
4//! Manages marker-related state including custom documents, status bar items,
5//! and source control management (SCM) state.
6//!
7//! ## ARCHITECTURAL ROLE
8//! MarkerState is part of the **FeatureState** module, representing
9//! marker-related state including:
10//! - Custom documents
11//! - Status bar items
12//! - SCM providers, groups, and resources
13//! - SCM provider handle counter
14//!
15//! ## KEY COMPONENTS
16//! - MarkerState: Main struct containing marker-related state and counter
17//! - Default: Initialization implementation
18//! - Helper methods: Marker manipulation utilities
19//!
20//! ## ERROR HANDLING
21//! - Thread-safe access via `Arc<Mutex<...>>`
22//! - Proper lock error handling with `MapLockError` helpers
23//!
24//! ## LOGGING
25//! State changes are logged at appropriate levels (debug, info, warn, error).
26//!
27//! ## PERFORMANCE CONSIDERATIONS
28//! - Lock mutexes briefly and release immediately
29//! - Avoid nested locks to prevent deadlocks
30//! - Use Arc for shared ownership across threads
31//! - Use AtomicU32 for unique SCM provider handles
32//!
33//! ## TODO
34//! - [ ] Add marker validation invariants
35//! - [ ] Implement marker lifecycle events
36//! - [ ] Add marker metrics collection
37
38use std::{
39	collections::HashMap,
40	sync::{
41		Arc,
42		Mutex as StandardMutex,
43		atomic::{AtomicU32, Ordering as AtomicOrdering},
44	},
45};
46
47use CommonLibrary::{
48	SourceControlManagement::DTO::{
49		SourceControlManagementGroupDTO::SourceControlManagementGroupDTO,
50		SourceControlManagementProviderDTO::SourceControlManagementProviderDTO,
51		SourceControlManagementResourceDTO::SourceControlManagementResourceDTO,
52	},
53	StatusBar::DTO::StatusBarEntryDTO::StatusBarEntryDTO,
54};
55use log::debug;
56
57use crate::ApplicationState::DTO::CustomDocumentStateDTO::CustomDocumentStateDTO;
58
59/// Marker-related state containing custom documents, status bar, and SCM state.
60#[derive(Clone)]
61pub struct MarkerState {
62	/// Active custom documents organized by ID.
63	pub ActiveCustomDocuments:Arc<StandardMutex<HashMap<String, CustomDocumentStateDTO>>>,
64
65	/// Active status bar items organized by ID.
66	pub ActiveStatusBarItems:Arc<StandardMutex<HashMap<String, StatusBarEntryDTO>>>,
67
68	/// SCM providers organized by handle.
69	pub SourceControlManagementProviders:Arc<StandardMutex<HashMap<u32, SourceControlManagementProviderDTO>>>,
70
71	/// SCM groups organized by provider handle and group ID.
72	pub SourceControlManagementGroups:
73		Arc<StandardMutex<HashMap<u32, HashMap<String, SourceControlManagementGroupDTO>>>>,
74
75	/// SCM resources organized by provider handle and group ID.
76	pub SourceControlManagementResources:
77		Arc<StandardMutex<HashMap<u32, HashMap<String, Vec<SourceControlManagementResourceDTO>>>>>,
78
79	/// Counter for generating unique SCM provider handles.
80	pub NextSourceControlManagementProviderHandle:Arc<AtomicU32>,
81}
82
83impl Default for MarkerState {
84	fn default() -> Self {
85		debug!("[MarkerState] Initializing default marker state...");
86
87		Self {
88			ActiveCustomDocuments:Arc::new(StandardMutex::new(HashMap::new())),
89			ActiveStatusBarItems:Arc::new(StandardMutex::new(HashMap::new())),
90			SourceControlManagementProviders:Arc::new(StandardMutex::new(HashMap::new())),
91			SourceControlManagementGroups:Arc::new(StandardMutex::new(HashMap::new())),
92			SourceControlManagementResources:Arc::new(StandardMutex::new(HashMap::new())),
93			NextSourceControlManagementProviderHandle:Arc::new(AtomicU32::new(1)),
94		}
95	}
96}
97
98impl MarkerState {
99	/// Gets the next available unique identifier for an SCM provider.
100	pub fn GetNextSourceControlManagementProviderHandle(&self) -> u32 {
101		self.NextSourceControlManagementProviderHandle
102			.fetch_add(1, AtomicOrdering::Relaxed)
103	}
104
105	/// Gets all active custom documents.
106	pub fn GetCustomDocuments(&self) -> HashMap<String, CustomDocumentStateDTO> {
107		self.ActiveCustomDocuments
108			.lock()
109			.ok()
110			.map(|guard| guard.clone())
111			.unwrap_or_default()
112	}
113
114	/// Adds or updates a custom document.
115	pub fn AddOrUpdateCustomDocument(&self, id:String, document:CustomDocumentStateDTO) {
116		if let Ok(mut guard) = self.ActiveCustomDocuments.lock() {
117			guard.insert(id, document);
118			debug!("[MarkerState] Custom document added/updated");
119		}
120	}
121
122	/// Removes a custom document by its ID.
123	pub fn RemoveCustomDocument(&self, id:&str) {
124		if let Ok(mut guard) = self.ActiveCustomDocuments.lock() {
125			guard.remove(id);
126			debug!("[MarkerState] Custom document removed: {}", id);
127		}
128	}
129
130	/// Gets all active status bar items.
131	pub fn GetStatusBarItems(&self) -> HashMap<String, StatusBarEntryDTO> {
132		self.ActiveStatusBarItems
133			.lock()
134			.ok()
135			.map(|guard| guard.clone())
136			.unwrap_or_default()
137	}
138
139	/// Adds or updates a status bar item.
140	pub fn AddOrUpdateStatusBarItem(&self, id:String, item:StatusBarEntryDTO) {
141		if let Ok(mut guard) = self.ActiveStatusBarItems.lock() {
142			guard.insert(id, item);
143			debug!("[MarkerState] Status bar item added/updated");
144		}
145	}
146
147	/// Removes a status bar item by its ID.
148	pub fn RemoveStatusBarItem(&self, id:&str) {
149		if let Ok(mut guard) = self.ActiveStatusBarItems.lock() {
150			guard.remove(id);
151			debug!("[MarkerState] Status bar item removed: {}", id);
152		}
153	}
154}