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}