use std::collections::BTreeMap;
use std::sync::Arc;
use khive_runtime::{BackendId, KhiveRuntime};
#[derive(Clone)]
pub struct BackendEntry {
pub id: BackendId,
pub runtime: Arc<KhiveRuntime>,
}
#[derive(Default)]
pub struct BackendRegistry {
backends: BTreeMap<String, BackendEntry>,
primary: Option<String>,
}
impl BackendRegistry {
pub fn new() -> Self {
Self::default()
}
pub fn register(&mut self, id: BackendId, runtime: Arc<KhiveRuntime>) -> bool {
let key = id.as_str().to_string();
if self.backends.contains_key(&key) {
return false;
}
if self.primary.is_none() {
self.primary = Some(key.clone());
}
self.backends.insert(key, BackendEntry { id, runtime });
true
}
pub fn get(&self, id: &BackendId) -> Option<&BackendEntry> {
self.backends.get(id.as_str())
}
pub fn primary(&self) -> Option<&BackendEntry> {
self.primary.as_deref().and_then(|k| self.backends.get(k))
}
pub fn iter(&self) -> impl Iterator<Item = &BackendEntry> {
self.backends.values()
}
pub fn len(&self) -> usize {
self.backends.len()
}
pub fn is_empty(&self) -> bool {
self.backends.is_empty()
}
pub fn ids(&self) -> Vec<BackendId> {
self.backends.keys().map(BackendId::new).collect()
}
}