medi-rs 2.2.0

A lightweight async mediator library for Rust with dependency injection and derive macros
Documentation
#![cfg(feature = "tokio")]

use medi_rs::{Result, medi_handler, medi_module, medi_task, mediator};
use tokio::sync::Notify;

static TASK_EVENT_HANDLED: Notify = Notify::const_new();

#[derive(Clone)]
struct TaskStarted;

#[medi_task]
async fn publish_task_started(mediator: &TaskEventMediator) {
    mediator.publish(TaskStarted).await.unwrap();
}

#[medi_handler]
async fn observe_task_started(_: TaskStarted) -> Result<()> {
    TASK_EVENT_HANDLED.notify_one();
    Ok(())
}

medi_module! {
    manifest task_event_manifest;
    tasks { publish_task_started; }
    events { TaskStarted => [observe_task_started]; }
}

mediator! {
    struct TaskEventMediator {
        event_queue_capacity: 1;
        event_workers: 1;
        modules: [task_event_manifest];
    }
}

#[tokio::test]
async fn tasks_can_publish_events_after_startup() {
    let mediator = Box::leak(Box::new(TaskEventMediator::new()));
    let handled = TASK_EVENT_HANDLED.notified();
    mediator.start().expect("mediator must start");

    tokio::time::timeout(std::time::Duration::from_secs(1), handled)
        .await
        .expect("task-published event should be handled");
}