omni_director/providers/
event_registry.rs1use std::collections::HashMap;
6use serde_json::Value;
7use tokio::sync::RwLock;
8
9pub type EventHandler = Box<dyn Fn(Value) -> Result<Value, String> + Send + Sync>;
11
12pub struct EventRegistry {
14 handlers: RwLock<HashMap<String, EventHandler>>,
16}
17
18impl EventRegistry {
19 pub fn new() -> Self {
21 Self {
22 handlers: RwLock::new(HashMap::new()),
23 }
24 }
25
26 pub async fn register(&self, event_name: &str, handler: EventHandler) {
28 let mut handlers = self.handlers.write().await;
29 handlers.insert(event_name.to_string(), handler);
30 println!("✅ Registered event handler: {}", event_name);
31 }
32
33 pub async fn execute(&self, event_name: &str, data: Value) -> Result<Value, String> {
35 let handlers = self.handlers.read().await;
36
37 if let Some(handler) = handlers.get(event_name) {
38 handler(data)
39 } else {
40 Err(format!("Event '{}' not found", event_name))
41 }
42 }
43
44 pub async fn list_events(&self) -> Vec<String> {
46 let handlers = self.handlers.read().await;
47 handlers.keys().cloned().collect()
48 }
49
50 pub async fn has_event(&self, event_name: &str) -> bool {
52 let handlers = self.handlers.read().await;
53 handlers.contains_key(event_name)
54 }
55}
56
57impl Default for EventRegistry {
58 fn default() -> Self {
59 Self::new()
60 }
61}
62
63pub trait EventRegistryClient {
65 fn register(&mut self, event_name: &str, handler: EventHandler);
66}
67
68impl EventRegistryClient for EventRegistry {
70 fn register(&mut self, event_name: &str, handler: EventHandler) {
71 let rt = tokio::runtime::Handle::current();
74 let event_name = event_name.to_string();
75 rt.block_on(async {
76 let mut handlers = self.handlers.write().await;
77 handlers.insert(event_name.clone(), handler);
78 println!("✅ Registered event handler: {}", event_name);
79 });
80 }
81}