I want these to work:
#[macro_use]
extern crate eventbus;
use eventbus::{Event, EventBus};
trait MyEvent : Event {
fn get_i(&self) -> i32;
fn set_i(&mut self, i32);
}
struct MyEventImpl {
i: i32
}
impl Event for MyEventImpl {
}
impl MyEvent for MyEventImpl {
fn get_i(&self) -> i32 {
self.i
}
fn set_i(&mut self, i: i32) {
self.i = i;
}
}
fn add_handler(e: &mut MyEvent) {
/* adds 1 */
let i = e.get_i();
e.set_i(i+1);
}
fn no_handler(e: &mut MyEvent) {
/* does nothing */
}
#[test]
fn test_basic_usage() {
let event_bus = EventBus::new();
//let handler_id = event_bus.register(add_handler, 0);
register_hook!(&event_bus, 0, dyn MyEvent, add_handler);
let mut event = MyEventImpl { i: 3 };
assert_eq!(event.i, 3);
post_event!(&event_bus, dyn MyEvent, &mut event);
assert_eq!(event.i, 4);
register_hook!(&event_bus, 1, dyn MyEvent, no_handler);
post_event!(&event_bus, dyn MyEvent, &mut event);
assert_eq!(event.i, 5);
//event_bus.unregister(handler_id);
post_event!(&event_bus, dyn MyEvent, &mut event);
//assert_eq!(event.i, 5);
}
The autotrait is used for creating bounds, e.g.:
fn foo1<T: Bar + ?Sized>(x: &T) {
<T as Bar>::baz(); // T gets an implicit bound `+ !ROATS`
}
fn foo2<T: Bar + ?Sized>(x: &T) {
<x as Bar>::baz(); // T gets an implicit bound `+ ?ROATS`
}
(This is more useful with macros)