use crate::llm::actions::Easy;
use std::collections::HashMap;
use std::sync::{Arc, LazyLock};
pub struct EasyRegistry {
protocols: HashMap<String, Arc<dyn Easy>>,
event_routing: HashMap<String, String>,
}
impl EasyRegistry {
fn new() -> Self {
let mut registry = Self {
protocols: HashMap::new(),
event_routing: HashMap::new(),
};
registry.register_protocols();
registry.build_event_routing();
registry
}
fn register_protocols(&mut self) {
self.register(Arc::new(crate::easy::http::HttpEasyProtocol));
}
#[allow(dead_code)]
fn register(&mut self, protocol: Arc<dyn Easy>) {
let name = protocol.protocol_name().to_string();
self.protocols.insert(name, protocol);
}
fn build_event_routing(&mut self) {
for (protocol_name, protocol) in &self.protocols {
for event_type_id in protocol.get_handled_event_type_ids() {
self.event_routing
.insert(event_type_id.to_string(), protocol_name.clone());
}
}
}
pub fn get_by_name(&self, name: &str) -> Option<Arc<dyn Easy>> {
self.protocols.get(name).cloned()
}
pub fn get_by_event_type(&self, event_type_id: &str) -> Option<Arc<dyn Easy>> {
self.event_routing
.get(event_type_id)
.and_then(|protocol_name| self.get_by_name(protocol_name))
}
pub fn get_all_names(&self) -> Vec<String> {
self.protocols.keys().cloned().collect()
}
pub fn get_all(&self) -> Vec<Arc<dyn Easy>> {
self.protocols.values().cloned().collect()
}
}
pub static EASY_REGISTRY: LazyLock<EasyRegistry> = LazyLock::new(EasyRegistry::new);