Skip to main content

a2ui_base/model/
surface_group_model.rs

1//! Manages multiple A2UI surfaces.
2
3use std::collections::HashMap;
4
5use super::surface_model::SurfaceModel;
6use crate::error::A2uiError;
7
8/// Container for all active surfaces.
9pub struct SurfaceGroupModel {
10    surfaces: HashMap<String, SurfaceModel>,
11}
12
13impl Default for SurfaceGroupModel {
14    fn default() -> Self {
15        Self::new()
16    }
17}
18
19impl SurfaceGroupModel {
20    pub fn new() -> Self {
21        Self {
22            surfaces: HashMap::new(),
23        }
24    }
25
26    /// Add a surface. Returns error if surface ID already exists.
27    pub fn add_surface(&mut self, surface: SurfaceModel) -> Result<(), A2uiError> {
28        if self.surfaces.contains_key(&surface.id) {
29            return Err(A2uiError::SurfaceExists(surface.id.clone()));
30        }
31        self.surfaces.insert(surface.id.clone(), surface);
32        Ok(())
33    }
34
35    /// Get a surface by ID.
36    pub fn get_surface(&self, id: &str) -> Option<&SurfaceModel> {
37        self.surfaces.get(id)
38    }
39
40    /// Get a mutable surface by ID.
41    pub fn get_surface_mut(&mut self, id: &str) -> Option<&mut SurfaceModel> {
42        self.surfaces.get_mut(id)
43    }
44
45    /// Delete a surface by ID.
46    pub fn delete_surface(&mut self, id: &str) -> Result<(), A2uiError> {
47        self.surfaces
48            .remove(id)
49            .ok_or_else(|| A2uiError::SurfaceNotFound(id.to_string()))?;
50        Ok(())
51    }
52
53    /// Iterate over all surfaces.
54    pub fn surfaces(&self) -> impl Iterator<Item = &SurfaceModel> {
55        self.surfaces.values()
56    }
57
58    /// Iterate mutably over all surfaces.
59    pub fn surfaces_mut(&mut self) -> impl Iterator<Item = &mut SurfaceModel> {
60        self.surfaces.values_mut()
61    }
62
63    /// Number of active surfaces.
64    #[allow(dead_code)]
65    pub fn len(&self) -> usize {
66        self.surfaces.len()
67    }
68}