Skip to main content

Mountain/ApplicationState/State/FeatureState/OutputChannels/
OutputChannelState.rs

1//! # OutputChannelState Module (ApplicationState)
2//!
3//! ## RESPONSIBILITIES
4//! Manages output channel state including output metadata, content, and
5//! presentation state.
6//!
7//! ## ARCHITECTURAL ROLE
8//! OutputChannelState is part of the **FeatureState** module, representing
9//! output channel state organized by channel ID.
10//!
11//! ## KEY COMPONENTS
12//! - OutputChannelState: Main struct containing output channels map
13//! - Default: Initialization implementation
14//! - Helper methods: Output channel manipulation utilities
15//!
16//! ## ERROR HANDLING
17//! - Thread-safe access via `Arc<Mutex<...>>`
18//! - Proper lock error handling with `MapLockError` helpers
19//!
20//! ## LOGGING
21//! State changes are logged at appropriate levels (debug, info, warn, error).
22//!
23//! ## PERFORMANCE CONSIDERATIONS
24//! - Lock mutexes briefly and release immediately
25//! - Avoid nested locks to prevent deadlocks
26//! - Use Arc for shared ownership across threads
27//!
28//! ## TODO
29//! - [ ] Add output channel validation invariants
30//! - [ ] Implement output channel lifecycle events
31//! - [ ] Add output channel metrics collection
32
33use std::{
34	collections::HashMap,
35	sync::{Arc, Mutex as StandardMutex},
36};
37
38use crate::{ApplicationState::DTO::OutputChannelStateDTO::OutputChannelStateDTO, dev_log};
39
40/// Output channels state containing channels by ID.
41#[derive(Clone)]
42pub struct OutputChannelState {
43	/// Output channels organized by ID.
44	pub OutputChannels:Arc<StandardMutex<HashMap<String, OutputChannelStateDTO>>>,
45}
46
47impl Default for OutputChannelState {
48	fn default() -> Self {
49		dev_log!("output", "[OutputChannelState] Initializing default output channel state...");
50
51		Self { OutputChannels:Arc::new(StandardMutex::new(HashMap::new())) }
52	}
53}
54
55impl OutputChannelState {
56	/// Gets all output channels.
57	pub fn GetAll(&self) -> HashMap<String, OutputChannelStateDTO> {
58		self.OutputChannels.lock().ok().map(|guard| guard.clone()).unwrap_or_default()
59	}
60
61	/// Gets an output channel by its ID.
62	pub fn Get(&self, id:&str) -> Option<OutputChannelStateDTO> {
63		self.OutputChannels.lock().ok().and_then(|guard| guard.get(id).cloned())
64	}
65
66	/// Adds or updates an output channel.
67	pub fn AddOrUpdate(&self, id:String, channel:OutputChannelStateDTO) {
68		if let Ok(mut guard) = self.OutputChannels.lock() {
69			guard.insert(id, channel);
70			dev_log!("output", "[OutputChannelState] Output channel added/updated");
71		}
72	}
73
74	/// Removes an output channel by its ID.
75	pub fn Remove(&self, id:&str) {
76		if let Ok(mut guard) = self.OutputChannels.lock() {
77			guard.remove(id);
78			dev_log!("output", "[OutputChannelState] Output channel removed: {}", id);
79		}
80	}
81
82	/// Clears all output channels.
83	pub fn Clear(&self) {
84		if let Ok(mut guard) = self.OutputChannels.lock() {
85			guard.clear();
86			dev_log!("output", "[OutputChannelState] All output channels cleared");
87		}
88	}
89
90	/// Gets the count of output channels.
91	pub fn Count(&self) -> usize { self.OutputChannels.lock().ok().map(|guard| guard.len()).unwrap_or(0) }
92
93	/// Checks if an output channel exists.
94	pub fn Contains(&self, id:&str) -> bool {
95		self.OutputChannels
96			.lock()
97			.ok()
98			.map(|guard| guard.contains_key(id))
99			.unwrap_or(false)
100	}
101}