Skip to main content

appcore_core/
registry.rs

1// =============================================================================
2//        #######
3//     ###       ###     F: registry.rs
4//    ##   ## ##   ##    P: AppCore-Runtime
5//         ## ##
6//                       C: 2026/05/29 20:47:35 by dnettoRaw
7//    ##   ## ##   ##    U: 2026/07/23 23:50:45 by dnettoRaw
8//      ###########      S: 1.0.1-rc.8
9// =============================================================================
10
11//! Shared registry primitive for ordered, duplicate-safe name registration.
12
13use crate::error::{RuntimeError, RuntimeResult};
14
15/// Generic ordered registry.
16#[derive(Debug)]
17pub struct NameRegistry<T> {
18    items: Vec<T>,
19}
20
21impl<T> Default for NameRegistry<T> {
22    fn default() -> Self {
23        Self { items: Vec::new() }
24    }
25}
26
27impl<T> NameRegistry<T>
28where
29    T: PartialEq,
30{
31    /// Creates an empty ordered registry.
32    pub fn new() -> Self {
33        Self::default()
34    }
35
36    /// Registers one item and rejects equality-based duplicates.
37    pub fn register(&mut self, item: T, kind: &str) -> RuntimeResult<()> {
38        if self.items.contains(&item) {
39            return Err(RuntimeError::DuplicateRegistryItem {
40                kind: kind.to_string(),
41            });
42        }
43
44        self.items.push(item);
45        Ok(())
46    }
47
48    /// Reports whether an equal item is registered.
49    pub fn contains(&self, item: &T) -> bool {
50        self.items.contains(item)
51    }
52
53    /// Returns the number of registered items.
54    pub fn len(&self) -> usize {
55        self.items.len()
56    }
57
58    /// Reports whether no items are registered.
59    pub fn is_empty(&self) -> bool {
60        self.items.is_empty()
61    }
62
63    /// Returns items in registration order.
64    pub fn list(&self) -> &[T] {
65        &self.items
66    }
67}