Skip to main content

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};
55
56use crate::{ApplicationState::DTO::CustomDocumentStateDTO::CustomDocumentStateDTO, dev_log};
57
58/// Marker-related state containing custom documents, status bar, and SCM state.
59#[derive(Clone)]
60pub struct MarkerState {
61	/// Active custom documents organized by ID.
62	pub ActiveCustomDocuments:Arc<StandardMutex<HashMap<String, CustomDocumentStateDTO>>>,
63
64	/// Active status bar items organized by ID.
65	pub ActiveStatusBarItems:Arc<StandardMutex<HashMap<String, StatusBarEntryDTO>>>,
66
67	/// SCM providers organized by handle.
68	pub SourceControlManagementProviders:Arc<StandardMutex<HashMap<u32, SourceControlManagementProviderDTO>>>,
69
70	/// SCM groups organized by provider handle and group ID.
71	pub SourceControlManagementGroups:
72		Arc<StandardMutex<HashMap<u32, HashMap<String, SourceControlManagementGroupDTO>>>>,
73
74	/// SCM resources organized by provider handle and group ID.
75	pub SourceControlManagementResources:
76		Arc<StandardMutex<HashMap<u32, HashMap<String, Vec<SourceControlManagementResourceDTO>>>>>,
77
78	/// Counter for generating unique SCM provider handles.
79	pub NextSourceControlManagementProviderHandle:Arc<AtomicU32>,
80}
81
82impl Default for MarkerState {
83	fn default() -> Self {
84		dev_log!("extensions", "[MarkerState] Initializing default marker state...");
85
86		Self {
87			ActiveCustomDocuments:Arc::new(StandardMutex::new(HashMap::new())),
88
89			ActiveStatusBarItems:Arc::new(StandardMutex::new(HashMap::new())),
90
91			SourceControlManagementProviders:Arc::new(StandardMutex::new(HashMap::new())),
92
93			SourceControlManagementGroups:Arc::new(StandardMutex::new(HashMap::new())),
94
95			SourceControlManagementResources:Arc::new(StandardMutex::new(HashMap::new())),
96
97			NextSourceControlManagementProviderHandle:Arc::new(AtomicU32::new(1)),
98		}
99	}
100}
101
102impl MarkerState {
103	/// Gets the next available unique identifier for an SCM provider.
104	pub fn GetNextSourceControlManagementProviderHandle(&self) -> u32 {
105		self.NextSourceControlManagementProviderHandle
106			.fetch_add(1, AtomicOrdering::Relaxed)
107	}
108
109	/// Gets all active custom documents.
110	pub fn GetCustomDocuments(&self) -> HashMap<String, CustomDocumentStateDTO> {
111		self.ActiveCustomDocuments
112			.lock()
113			.ok()
114			.map(|guard| guard.clone())
115			.unwrap_or_default()
116	}
117
118	/// Adds or updates a custom document.
119	pub fn AddOrUpdateCustomDocument(&self, id:String, document:CustomDocumentStateDTO) {
120		if let Ok(mut guard) = self.ActiveCustomDocuments.lock() {
121			guard.insert(id, document);
122
123			dev_log!("extensions", "[MarkerState] Custom document added/updated");
124		}
125	}
126
127	/// Removes a custom document by its ID.
128	pub fn RemoveCustomDocument(&self, id:&str) {
129		if let Ok(mut guard) = self.ActiveCustomDocuments.lock() {
130			guard.remove(id);
131
132			dev_log!("extensions", "[MarkerState] Custom document removed: {}", id);
133		}
134	}
135
136	/// Gets all active status bar items.
137	pub fn GetStatusBarItems(&self) -> HashMap<String, StatusBarEntryDTO> {
138		self.ActiveStatusBarItems
139			.lock()
140			.ok()
141			.map(|guard| guard.clone())
142			.unwrap_or_default()
143	}
144
145	/// Adds or updates a status bar item.
146	pub fn AddOrUpdateStatusBarItem(&self, id:String, item:StatusBarEntryDTO) {
147		if let Ok(mut guard) = self.ActiveStatusBarItems.lock() {
148			guard.insert(id, item);
149
150			dev_log!("extensions", "[MarkerState] Status bar item added/updated");
151		}
152	}
153
154	/// Removes a status bar item by its ID.
155	pub fn RemoveStatusBarItem(&self, id:&str) {
156		if let Ok(mut guard) = self.ActiveStatusBarItems.lock() {
157			guard.remove(id);
158
159			dev_log!("extensions", "[MarkerState] Status bar item removed: {}", id);
160		}
161	}
162}