4个版本

0.2.2 2024年5月29日
0.2.1 2024年2月21日
0.2.0 2023年10月31日
0.1.0 2023年10月29日

#341 in 异步

Download history 110/week @ 2024-05-24 28/week @ 2024-05-31 5/week @ 2024-06-07

215 个月下载量

MIT 许可证

38KB
733 行代码

Busstop

Busstop 是一个命令和查询总线 crate

命令示例
use busstop::{CommandHandler, DispatchableCommand};


#[tokio::main]
async fn main() {
    // 1. Register the handler for "CreateUser" command
    CreateUser::command_handler::<CreateUserHandler>().await;

    // 2. Create an instance of the command
    let cmd = CreateUser {
        email: "[email protected]".to_string(),
    };

    // 3. Dispatch the command
    cmd.dispatch_command().await;
}


// 4. Create the command struct
#[derive(Debug)]
struct CreateUser {
    pub email: String,
}

// 5. Make the Command dispatchable (see step 3)
impl DispatchableCommand for CreateUser {}


// 6. Create the handler struct
#[derive(Default)]
struct CreateUserHandler;

// 7. Implement the "CommandHandler" trait for this handler
#[busstop::async_trait]
impl CommandHandler for CreateUserHandler {
    async fn handle_command(&self, dc: busstop::DispatchedCommand) -> busstop::DispatchedCommand {
        let command = dc.the_command::<CreateUser>();

        println!("handling 'create user' : {:?}", command.unwrap().email);

        dc
    }
}

查询示例
use busstop::{DispatchableQuery, DispatchedQuery, QueryHandler};

#[tokio::main]
async fn main() {

    // 1. Register query handler
    SumOfQuery::query_handler::<HandlerSumOfQuery>().await;

    // 2. Create an instance of the query
    let query = SumOfQuery {
        numbers: vec![2, 4, 6, 8],
    };

    // 3. Dispatch the query
    let result = query.dispatch_query().await;

    // 4. Use the returned value
    if let Some(d) = result {
        println!("Answer returned: {:#?}", d.value::<i32>());
    }
}

// 5. Create a Query Struct
#[derive(Debug)]
struct SumOfQuery {
    pub numbers: Vec<i32>,
}

// 6. Implement the "DispatchableQuery" trait for "SumOfQuery"
impl DispatchableQuery for SumOfQuery {}

// 7. Create a Handler struct
#[derive(Default)]
struct HandlerSumOfQuery;

// 8. Implement "QueryHandler" trait for "HandleSumOfQuery"
#[busstop::async_trait]
impl QueryHandler for HandlerSumOfQuery {
    async fn handle_query(&self, dispatched_query: busstop::DispatchedQuery) -> DispatchedQuery {
        // 9. Get the query instance
        let query = dispatched_query.the_query::<SumOfQuery>(); 

        let sum = if let Some(subject) = query {
            log::info!("summing up: {:?}", subject.numbers);
            subject.numbers.iter().fold(0, |sum, n| sum + n)
        } else {
            0
        };

        println!("handling 'sum of query'. sum: {:?}", &sum);

        // 10. Make sure to set the value to return
        dispatched_query.set_value(sum);

        dispatched_query
    }
}

示例

示例文件夹 examples 包含简单和完整的示例。如果示例没有帮助,请告诉我你的用例,我会尽力提供。

反馈

如果你觉得这个 crate 有用,请给仓库加星。提交你的问题和建议。

许可证

MIT 许可证 (MIT)

在此特此免费授予任何获得本软件及其相关文档文件(以下简称“软件”)副本的人(以下简称“用户”),无限制地处理软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许软件接收方这样做,前提是遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、针对特定目的的适用性和非侵权性。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任承担责任,无论此类责任是基于合同、侵权或其他方式,由软件或其使用或其他方式引起。

依赖项

~3–4.5MB
~80K SLoC