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			ActiveStatusBarItems:Arc::new(StandardMutex::new(HashMap::new())),
89			SourceControlManagementProviders:Arc::new(StandardMutex::new(HashMap::new())),
90			SourceControlManagementGroups:Arc::new(StandardMutex::new(HashMap::new())),
91			SourceControlManagementResources:Arc::new(StandardMutex::new(HashMap::new())),
92			NextSourceControlManagementProviderHandle:Arc::new(AtomicU32::new(1)),
93		}
94	}
95}
96
97impl MarkerState {
98	/// Gets the next available unique identifier for an SCM provider.
99	pub fn GetNextSourceControlManagementProviderHandle(&self) -> u32 {
100		self.NextSourceControlManagementProviderHandle
101			.fetch_add(1, AtomicOrdering::Relaxed)
102	}
103
104	/// Gets all active custom documents.
105	pub fn GetCustomDocuments(&self) -> HashMap<String, CustomDocumentStateDTO> {
106		self.ActiveCustomDocuments
107			.lock()
108			.ok()
109			.map(|guard| guard.clone())
110			.unwrap_or_default()
111	}
112
113	/// Adds or updates a custom document.
114	pub fn AddOrUpdateCustomDocument(&self, id:String, document:CustomDocumentStateDTO) {
115		if let Ok(mut guard) = self.ActiveCustomDocuments.lock() {
116			guard.insert(id, document);
117			dev_log!("extensions", "[MarkerState] Custom document added/updated");
118		}
119	}
120
121	/// Removes a custom document by its ID.
122	pub fn RemoveCustomDocument(&self, id:&str) {
123		if let Ok(mut guard) = self.ActiveCustomDocuments.lock() {
124			guard.remove(id);
125			dev_log!("extensions", "[MarkerState] Custom document removed: {}", id);
126		}
127	}
128
129	/// Gets all active status bar items.
130	pub fn GetStatusBarItems(&self) -> HashMap<String, StatusBarEntryDTO> {
131		self.ActiveStatusBarItems
132			.lock()
133			.ok()
134			.map(|guard| guard.clone())
135			.unwrap_or_default()
136	}
137
138	/// Adds or updates a status bar item.
139	pub fn AddOrUpdateStatusBarItem(&self, id:String, item:StatusBarEntryDTO) {
140		if let Ok(mut guard) = self.ActiveStatusBarItems.lock() {
141			guard.insert(id, item);
142			dev_log!("extensions", "[MarkerState] Status bar item added/updated");
143		}
144	}
145
146	/// Removes a status bar item by its ID.
147	pub fn RemoveStatusBarItem(&self, id:&str) {
148		if let Ok(mut guard) = self.ActiveStatusBarItems.lock() {
149			guard.remove(id);
150			dev_log!("extensions", "[MarkerState] Status bar item removed: {}", id);
151		}
152	}
153}