use crate::message::Context;
use crate::runtime::{NodeBase, Result};
use async_trait::async_trait;
use std::collections::HashMap;
use std::sync::Arc;
use tokio::sync::RwLock;
#[async_trait]
pub trait MessageHandler: Send + Sync + 'static {
async fn on_create(&mut self) -> Result<()>;
async fn on_message(&mut self, ctx: &mut Context) -> Result<()>;
async fn on_close(&mut self) -> Result<()>;
}
pub struct NodeHandler {
pub node: NodeBase,
pub handler: Arc<RwLock<Box<dyn MessageHandler>>>,
}
lazy_static::lazy_static! {
static ref HANDLERS: parking_lot::RwLock<HashMap<String, NodeHandler>> = parking_lot::RwLock::new(HashMap::new());
}
pub fn add_node_handler(node: NodeBase, handler: Box<dyn MessageHandler>) {
let guid = node.guid.clone();
let node_handler = NodeHandler {
node,
handler: Arc::new(RwLock::new(handler)),
};
HANDLERS.write().insert(guid, node_handler);
}
pub fn get_node_handler(guid: &str) -> Option<NodeHandlerRef> {
let handlers = HANDLERS.read();
handlers.get(guid).map(|h| NodeHandlerRef {
node: h.node.clone(),
handler: h.handler.clone(),
})
}
pub struct NodeHandlerRef {
pub node: NodeBase,
pub handler: Arc<RwLock<Box<dyn MessageHandler>>>,
}