use std::collections::HashMap; use crate::message::Message; use std::sync::mpsc::Sender; pub trait MessageHandler: Send { fn get_code(&self) -> u8; fn handle(&self, message: &mut Message, sender: Sender); } pub struct Handlers { handlers: HashMap + Send>>, } impl Default for Handlers { fn default() -> Self { Self::new() } } impl Handlers { #[must_use] pub fn new() -> Self { Self { handlers: HashMap::new(), } } pub fn register_handler(&mut self, handler: H) -> &mut Self where H: 'static + MessageHandler + Send + Sync, { self.handlers.insert(handler.get_code(), Box::new(handler)); self } #[must_use] pub fn get_handler( &self, code: u8, ) -> Option<&(dyn MessageHandler + Send)> { self.handlers.get(&code).map(|v| &**v) } }