Mountain/ApplicationState/State/FeatureState/Terminals/
TerminalState.rs1use std::{
35 collections::HashMap,
36 sync::{
37 Arc,
38 Mutex as StandardMutex,
39 atomic::{AtomicU64, Ordering as AtomicOrdering},
40 },
41};
42
43use log::debug;
44
45use crate::ApplicationState::DTO::TerminalStateDTO::TerminalStateDTO;
46
47#[derive(Clone)]
50pub struct TerminalState {
51 pub ActiveTerminals:Arc<StandardMutex<HashMap<u64, Arc<StandardMutex<TerminalStateDTO>>>>>,
53
54 pub NextTerminalIdentifier:Arc<AtomicU64>,
56}
57
58impl Default for TerminalState {
59 fn default() -> Self {
60 debug!("[TerminalState] Initializing default terminal state...");
61
62 Self {
63 ActiveTerminals:Arc::new(StandardMutex::new(HashMap::new())),
64 NextTerminalIdentifier:Arc::new(AtomicU64::new(1)),
65 }
66 }
67}
68
69impl TerminalState {
70 pub fn GetNextTerminalIdentifier(&self) -> u64 { self.NextTerminalIdentifier.fetch_add(1, AtomicOrdering::Relaxed) }
72
73 pub fn GetAll(&self) -> HashMap<u64, TerminalStateDTO> {
75 self.ActiveTerminals
76 .lock()
77 .ok()
78 .map(|guard| {
79 guard
80 .iter()
81 .filter_map(|(id, arc)| arc.lock().ok().map(|dto| (*id, dto.clone())))
82 .collect()
83 })
84 .unwrap_or_default()
85 }
86
87 pub fn Get(&self, id:u64) -> Option<TerminalStateDTO> {
89 self.ActiveTerminals
90 .lock()
91 .ok()
92 .and_then(|guard| guard.get(&id).and_then(|arc| arc.lock().ok().map(|dto| dto.clone())))
93 }
94
95 pub fn GetArc(&self, id:u64) -> Option<Arc<StandardMutex<TerminalStateDTO>>> {
97 self.ActiveTerminals.lock().ok().and_then(|guard| guard.get(&id).cloned())
98 }
99
100 pub fn AddOrUpdate(&self, id:u64, terminal:TerminalStateDTO) {
102 if let Ok(mut guard) = self.ActiveTerminals.lock() {
103 guard.insert(id, Arc::new(StandardMutex::new(terminal)));
104 debug!("[TerminalState] Terminal added/updated with ID: {}", id);
105 }
106 }
107
108 pub fn Remove(&self, id:u64) {
110 if let Ok(mut guard) = self.ActiveTerminals.lock() {
111 guard.remove(&id);
112 debug!("[TerminalState] Terminal removed with ID: {}", id);
113 }
114 }
115
116 pub fn Clear(&self) {
118 if let Ok(mut guard) = self.ActiveTerminals.lock() {
119 guard.clear();
120 debug!("[TerminalState] All terminals cleared");
121 }
122 }
123
124 pub fn Count(&self) -> usize { self.ActiveTerminals.lock().ok().map(|guard| guard.len()).unwrap_or(0) }
126
127 pub fn Contains(&self, id:u64) -> bool {
129 self.ActiveTerminals
130 .lock()
131 .ok()
132 .map(|guard| guard.contains_key(&id))
133 .unwrap_or(false)
134 }
135}