use std::any::{Any, TypeId};
use barker::{Message, MessageBus, MessageHandler};
#[derive(Debug)]
struct Tick(u32);
impl Message for Tick {
fn as_any(&self) -> &dyn Any {
self
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
}
struct ClockPlugin;
impl ClockPlugin {
fn init(&self, _bus: &MessageBus) {}
fn run(&self, bus: &MessageBus, ticks: u32) {
for i in 0..ticks {
bus.send(Tick(i)).expect("send tick");
}
}
}
struct LoggerPlugin;
struct TickLogger;
impl MessageHandler for TickLogger {
fn call(&self, msg: &dyn Message) {
if let Some(tick) = msg.as_any().downcast_ref::<Tick>() {
println!("[logger] tick #{}", tick.0);
}
}
}
impl LoggerPlugin {
fn init(&self, bus: &MessageBus) {
bus.register_handler(Box::new(TickLogger), Some(TypeId::of::<Tick>()))
.expect("register tick logger");
}
}
fn main() {
let bus = MessageBus::new();
let clock = ClockPlugin;
let logger = LoggerPlugin;
clock.init(&bus);
logger.init(&bus);
clock.run(&bus, 4);
bus.process_messages(None).expect("drain");
}