use std::collections::HashMap;
use std::sync::Arc;
use super::interface::ReactiveWebEngine;
#[derive(Clone, Default)]
pub struct ReactiveWebEngineRegistry {
engines: HashMap<String, Arc<dyn ReactiveWebEngine>>,
}
impl ReactiveWebEngineRegistry {
pub fn new() -> Self {
Self {
engines: HashMap::new(),
}
}
pub fn register(&mut self, engine: Arc<dyn ReactiveWebEngine>) {
self.engines.insert(engine.id().to_string(), engine);
}
pub fn get(&self, id: &str) -> Option<Arc<dyn ReactiveWebEngine>> {
self.engines.get(id).map(Arc::clone)
}
pub fn ids(&self) -> Vec<String> {
let mut ids: Vec<String> = self.engines.keys().cloned().collect();
ids.sort();
ids
}
pub fn resolve_or_default(&self, id: Option<&str>) -> Option<Arc<dyn ReactiveWebEngine>> {
if let Some(id) = id
&& let Some(engine) = self.get(id)
{
return Some(engine);
}
if let Some(engine) = self.get("rwe") {
return Some(engine);
}
self.engines.values().next().map(Arc::clone)
}
}