#事件总线 #事件 #异步

basu

支持同步和异步功能的事件总线crate

6个版本

0.1.5 2023年7月10日
0.1.4 2023年6月21日

#758 in 异步

每月 46 次下载

MIT 许可证

30KB
344

Basu

basu

MIT licensed crates.io docs.rs

一个灵活的事件总线crate,通过事件驱动模式解耦应用程序的不同组件。

Basu提供异步和同步事件处理的支持。

示例

功能

  • 同步

    • 要使用同步Basu,请确保在Cargo.toml中禁用basu crate的default-features
      [dependencies]
      basu = { version = "0.1", default-features = false, features = ["sync"] }
      
  • 异步

    • 要在Rust项目中使用异步Basu,请在Cargo.toml中添加以下行
      [dependencies]
      basu = "0.1"
      

用法

要运行示例,请在Cargo.toml中添加以下行

[dependencies]
tokio = { version = "1", default-features = false, features = [ "macros", "rt-multi-thread"] }
basu = "0.1"

然后,在你的main.rs

use basu::{async_trait, error::BasuError, event::Event, EventBus, Handle};

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

struct MyEventHandler;

// Implement the Handle trait for your event handler structs
#[async_trait]
impl Handle<Data> for MyEventHandler {
    async fn handle(&self, event: &Event<Data>) -> Result<(), BasuError> {
        // Handle the event logic here
        Ok(())
    }
}

#[tokio::main]
async fn main() -> Result<(), BasuError> {
    let event_bus = EventBus::new();

    let eveny_type = "my_event";
    // Subscribe to events by providing an event name and the corresponding event handler
    let handler = Box::new(MyEventHandler);
    let handler_id = event_bus.subscribe(eveny_type, handler).await;

    // Publish events
    let event = Event::new(Data {
        message: "hello".to_owned(),
    });
    event_bus.publish(eveny_type, &event).await?;

    // Unsubscribe from events
    event_bus.unsubscribe(eveny_type, &handler_id).await
}

许可证

本项目遵循MIT许可证

依赖

~1–3MB
~61K SLoC