omni_director/providers/
event_registry.rs

1//! # Event Registry
2//!
3//! Central registry for dynamic event registration and dispatch
4
5use std::collections::HashMap;
6use serde_json::Value;
7use tokio::sync::RwLock;
8
9/// Event handler type
10pub type EventHandler = Box<dyn Fn(Value) -> Result<Value, String> + Send + Sync>;
11
12/// Central event registry for dynamic registration
13pub struct EventRegistry {
14    /// Map of event name to handler
15    handlers: RwLock<HashMap<String, EventHandler>>,
16}
17
18impl EventRegistry {
19    /// Create a new event registry
20    pub fn new() -> Self {
21        Self {
22            handlers: RwLock::new(HashMap::new()),
23        }
24    }
25
26    /// Register an event handler
27    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    /// Execute an event by name
34    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    /// List all registered events
45    pub async fn list_events(&self) -> Vec<String> {
46        let handlers = self.handlers.read().await;
47        handlers.keys().cloned().collect()
48    }
49
50    /// Check if an event is registered
51    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
63/// Trait for objects that can register with the event registry
64pub trait EventRegistryClient {
65    fn register(&mut self, event_name: &str, handler: EventHandler);
66}
67
68/// Implementation of EventRegistryClient for EventRegistry
69impl EventRegistryClient for EventRegistry {
70    fn register(&mut self, event_name: &str, handler: EventHandler) {
71        // This is a sync version for use during initialization
72        // We need to use the async version internally
73        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}