4 个版本 (2 个破坏性更新)
0.3.0-alpha0 | 2024 年 5 月 10 日 |
---|---|
0.2.2 | 2023 年 12 月 17 日 |
0.2.1 | 2023 年 11 月 23 日 |
0.2.0 |
|
0.1.0 | 2023 年 7 月 28 日 |
#553 in Rust 模式
8KB
81 行
Brug
这是一座桥梁!
Brug 允许您将函数调用转换为类似 RPC 的枚举,并提供生成外观特性和执行者特性的功能
例子胜于千言万语
use brug::{Performer, tokio::OneShot};
struct MyStruct;
#[brug::performer]
impl MyStruct {
fn add(a: usize, b: usize) -> usize {
a + b
}
}
async fn main() {
let (s, r) = OneShot::pair();
let command = MyStructCommand::Add(1, 2, s);
let mut my = MyStruct;
my.perform(command).await;
assert_eq!(r.receive().await.expect("command got dropped before processed"), 3);
}
// The attribute on MyStruct expands to the following:
pub enum MyStructCommand<T: ::brug::Transport> {
Add(usize, usize, T::Sender<usize>),
}
#[::brug::async_trait]
impl ::brug::Performer<MyStructCommand> for MyStruct {
async fn perform(&mut self, command: MyStructCommand) {
match command {
MyStructCommand::Add(a, b, resp) => {
::brug::Sender::send(resp, self.add(a, b)).await;
}
}
}
}
#[::brug::async_trait]
pub trait MyStructFacade<T: ::brug::Transport> {
async fn add(&self, a: usize, b: usize) -> usize {
let (s, r) = T::pair();
self.handle(MyStructCommand::Add(a, b, s)).await;
return r.receive().await.expect("add didn't return a value");
}
async fn handle(&self, command: MyStructCommand<T>);
}
#[::brug::async_trait]
pub trait MyStructFacadeMut<T: ::brug::Transport> {
async fn add(&mut self, a: usize, b: usize) -> usize {
let (s, r) = T::pair();
self.handle(MyStructCommand::Add(a, b, s)).await;
return r.receive().await.expect("add didn't return a value");
}
async fn handle(&mut self, command: MyStructCommand<T>);
}
#[::brug::async_trait]
impl<T: ::brug::Transport, F: MyStructFacade<T> + Send + Sync> MyStructFacadeMut<T> for F {
async fn handle(&mut self, command: MyStructCommand<T>) {
MyStructFacadeMut::handle(self, command).await;
}
}
命令枚举允许您为给定的结构体使用 RPC 模式,而外观则允许您创建一个像给定结构体一样工作的对象,但实际上是使用该 RPC 模式
依赖项
~0–1.3MB
~23K SLoC