basu 0.1.9

Eventbus crate with sync and async features
Documentation
use crate::{async_trait, error::BasuError, event::Event, EventBus, Handle};

#[derive(Debug)]
struct Data {
    message: String,
}

struct HandlerA;
struct HandlerB;

#[async_trait]
impl Handle<Data> for HandlerA {
    async fn handle(&self, event: &Event<Data>) -> Result<(), BasuError> {
        let data = event.get_data();
        println!("HandlerA: {}", data.message);

        Ok(())
    }
}

#[async_trait]
impl Handle<Data> for HandlerB {
    async fn handle(&self, event: &Event<Data>) -> Result<(), BasuError> {
        let data = event.get_data();
        println!("HandlerB: {}", data.message);

        Ok(())
    }
}

const ECHO: &str = "echo";

#[tokio::test]
async fn test() {
    let eventbus = EventBus::new();

    let handler_a_id = eventbus.subscribe(ECHO, Box::new(HandlerA)).await;
    println!("HandlerA id: {:?}", handler_a_id);

    let event = Event::new(Data {
        message: "{data from event}".to_owned(),
    });

    eventbus.publish(ECHO, &event).await.unwrap();
    let event_types = eventbus.list().await;
    assert_eq!(event_types, vec![ECHO.to_owned()]);

    let count = eventbus.get_handler_count(ECHO).await.unwrap();
    assert_eq!(count, 1);

    let handler_b_id = eventbus.subscribe(ECHO, Box::new(HandlerB)).await;
    println!("HandlerB id: {:?}", handler_b_id);

    let count = eventbus.get_handler_count(ECHO).await.unwrap();
    assert_eq!(count, 2);
    eventbus.publish(ECHO, &event).await.unwrap();

    eventbus.unsubscribe(ECHO, &handler_a_id).await.unwrap();
    let count = eventbus.get_handler_count(ECHO).await.unwrap();
    assert_eq!(count, 1);

    eventbus.clear().await;
    let event_types = eventbus.list().await;
    assert_eq!(event_types.len(), 0);
}