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 crate::{ApplicationState::DTO::TerminalStateDTO::TerminalStateDTO, dev_log};
44
45#[derive(Clone)]
48pub struct TerminalState {
49 pub ActiveTerminals:Arc<StandardMutex<HashMap<u64, Arc<StandardMutex<TerminalStateDTO>>>>>,
51
52 pub NextTerminalIdentifier:Arc<AtomicU64>,
54}
55
56impl Default for TerminalState {
57 fn default() -> Self {
58 dev_log!("terminal", "[TerminalState] Initializing default terminal state...");
59
60 Self {
61 ActiveTerminals:Arc::new(StandardMutex::new(HashMap::new())),
62
63 NextTerminalIdentifier:Arc::new(AtomicU64::new(1)),
64 }
65 }
66}
67
68impl TerminalState {
69 pub fn GetNextTerminalIdentifier(&self) -> u64 { self.NextTerminalIdentifier.fetch_add(1, AtomicOrdering::Relaxed) }
71
72 pub fn GetAll(&self) -> HashMap<u64, TerminalStateDTO> {
74 self.ActiveTerminals
75 .lock()
76 .ok()
77 .map(|guard| {
78 guard
79 .iter()
80 .filter_map(|(id, arc)| arc.lock().ok().map(|dto| (*id, dto.clone())))
81 .collect()
82 })
83 .unwrap_or_default()
84 }
85
86 pub fn Get(&self, id:u64) -> Option<TerminalStateDTO> {
88 self.ActiveTerminals
89 .lock()
90 .ok()
91 .and_then(|guard| guard.get(&id).and_then(|arc| arc.lock().ok().map(|dto| dto.clone())))
92 }
93
94 pub fn GetArc(&self, id:u64) -> Option<Arc<StandardMutex<TerminalStateDTO>>> {
96 self.ActiveTerminals.lock().ok().and_then(|guard| guard.get(&id).cloned())
97 }
98
99 pub fn AddOrUpdate(&self, id:u64, terminal:TerminalStateDTO) {
101 if let Ok(mut guard) = self.ActiveTerminals.lock() {
102 guard.insert(id, Arc::new(StandardMutex::new(terminal)));
103
104 dev_log!("terminal", "[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
113 dev_log!("terminal", "[TerminalState] Terminal removed with ID: {}", id);
114 }
115 }
116
117 pub fn Clear(&self) {
119 if let Ok(mut guard) = self.ActiveTerminals.lock() {
120 guard.clear();
121
122 dev_log!("terminal", "[TerminalState] All terminals cleared");
123 }
124 }
125
126 pub fn Count(&self) -> usize { self.ActiveTerminals.lock().ok().map(|guard| guard.len()).unwrap_or(0) }
128
129 pub fn Contains(&self, id:u64) -> bool {
131 self.ActiveTerminals
132 .lock()
133 .ok()
134 .map(|guard| guard.contains_key(&id))
135 .unwrap_or(false)
136 }
137}