use crate::connection::WorkerConnectionKey;
use appcore_types::CapabilityName;
use std::collections::{HashMap, HashSet};
#[derive(Debug, Default, Clone)]
pub struct CapabilityRegistry {
capability_to_workers: HashMap<CapabilityName, HashSet<WorkerConnectionKey>>,
worker_to_capabilities: HashMap<WorkerConnectionKey, HashSet<CapabilityName>>,
}
impl CapabilityRegistry {
pub fn new() -> Self {
Self::default()
}
pub fn register(&mut self, worker: WorkerConnectionKey, capabilities: Vec<CapabilityName>) {
self.deregister(&worker);
let mut caps_set = HashSet::new();
for cap in capabilities {
self.capability_to_workers
.entry(cap.clone())
.or_default()
.insert(worker.clone());
caps_set.insert(cap);
}
self.worker_to_capabilities.insert(worker, caps_set);
}
pub fn deregister(&mut self, worker: &WorkerConnectionKey) {
if let Some(caps) = self.worker_to_capabilities.remove(worker) {
for cap in caps {
if let Some(workers) = self.capability_to_workers.get_mut(&cap) {
workers.remove(worker);
if workers.is_empty() {
self.capability_to_workers.remove(&cap);
}
}
}
}
}
pub fn resolve(&self, capability: &CapabilityName) -> Option<&HashSet<WorkerConnectionKey>> {
self.capability_to_workers.get(capability)
}
pub fn all_capabilities(&self) -> Vec<CapabilityName> {
self.capability_to_workers.keys().cloned().collect()
}
}