appcore_gateway/
registry.rs1use crate::connection::WorkerConnectionKey;
14use appcore_types::CapabilityName;
15use std::collections::{HashMap, HashSet};
16
17#[derive(Debug, Default, Clone)]
19pub struct CapabilityRegistry {
20 capability_to_workers: HashMap<CapabilityName, HashSet<WorkerConnectionKey>>,
21 worker_to_capabilities: HashMap<WorkerConnectionKey, HashSet<CapabilityName>>,
22}
23
24impl CapabilityRegistry {
25 pub fn new() -> Self {
27 Self::default()
28 }
29
30 pub fn register(&mut self, worker: WorkerConnectionKey, capabilities: Vec<CapabilityName>) {
32 self.deregister(&worker);
33 let mut caps_set = HashSet::new();
34 for cap in capabilities {
35 self.capability_to_workers
36 .entry(cap.clone())
37 .or_default()
38 .insert(worker.clone());
39 caps_set.insert(cap);
40 }
41 self.worker_to_capabilities.insert(worker, caps_set);
42 }
43
44 pub fn deregister(&mut self, worker: &WorkerConnectionKey) {
46 if let Some(caps) = self.worker_to_capabilities.remove(worker) {
47 for cap in caps {
48 if let Some(workers) = self.capability_to_workers.get_mut(&cap) {
49 workers.remove(worker);
50 if workers.is_empty() {
51 self.capability_to_workers.remove(&cap);
52 }
53 }
54 }
55 }
56 }
57
58 pub fn resolve(&self, capability: &CapabilityName) -> Option<&HashSet<WorkerConnectionKey>> {
60 self.capability_to_workers.get(capability)
61 }
62
63 pub fn all_capabilities(&self) -> Vec<CapabilityName> {
65 self.capability_to_workers.keys().cloned().collect()
66 }
67}