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 异步
215 个月下载量
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