1 stable release
2.0.2 | Nov 4, 2022 |
---|---|
2.0.0 |
|
1.0.0 |
|
0.1.0 |
|
#5 in #mediator
46KB
660 lines
mediator-sys
Strongly typed, extensible event mediator. For more info and explanation, please see the docs.
Warning
This crate has been renamed and is soon phasing out. Please use mediatrix instead.
Usage
Sync
use mediator_sys::synchronous::basic::*;
struct UserMessageRequest {
msg: String,
priority: u8,
}
#[derive(Debug, Clone)]
enum NotifyEvent {
Ignore,
SendEmail(String),
SendTextMessage(String),
}
impl RequestHandler<UserMessageRequest, NotifyEvent> for BasicMediator<NotifyEvent> {
fn handle(&self, req: UserMessageRequest) {
match req.priority {
0 => self.publish(NotifyEvent::Ignore),
1..=5 => self.publish(NotifyEvent::SendEmail(req.msg)),
_ => self.publish(NotifyEvent::SendTextMessage(req.msg)),
};
}
}
let mediator = BasicMediator::<NotifyEvent>::builder()
.add_listener(move |ev| {
if let NotifyEvent::Ignore = ev {
println!("Ignored some Message")
}
})
.add_listener(move |ev| {
if let NotifyEvent::SendEmail(msg) = ev {
println!("Send Email with Message: {}", msg)
}
})
.add_listener(move |ev| {
if let NotifyEvent::SendTextMessage(msg) = ev {
println!("Send SMS with Message: {}", msg)
}
})
.build();
mediator.send(UserMessageRequest {
msg: String::from("Hello World"),
priority: 0,
});
mediator.send(UserMessageRequest {
msg: String::from("Is Rust Memory Safe?"),
priority: 2,
});
mediator.send(UserMessageRequest {
msg: String::from("New Rust Version"),
priority: 8,
});
// Prints: Ignored some Message
mediator.next().ok();
// Prints: Send Email with Message: Is Rust Memory Safe?
mediator.next().ok();
// Prints: Send SMS with Message: New Rust Version
mediator.next().ok();
Async
Click to open the asynchronous version
use mediator_sys::asynchronous::basic::*;
use async_trait::async_trait;
struct UserMessageRequest {
msg: String,
priority: u8,
}
#[derive(Debug, Clone)]
enum NotifyEvent {
Ignore,
SendEmail(String),
SendTextMessage(String),
}
#[async_trait]
impl AsyncRequestHandler<UserMessageRequest, NotifyEvent> for BasicAsyncMediator<NotifyEvent> {
async fn handle(&self, req: UserMessageRequest) {
match req.priority {
0 => self.publish(NotifyEvent::Ignore).await,
1..=5 => self.publish(NotifyEvent::SendEmail(req.msg)).await,
_ => self.publish(NotifyEvent::SendTextMessage(req.msg)).await,
};
}
}
let async_mediator = BasicAsyncMediator::<NotifyEvent>::builder()
.add_listener(move |ev| {
if let NotifyEvent::Ignore = ev {
println!("Ignored some Message")
}
})
.add_listener(move |ev| {
if let NotifyEvent::SendEmail(msg) = ev {
println!("Send Email with Message: {}", msg)
}
})
.add_listener(move |ev| {
if let NotifyEvent::SendTextMessage(msg) = ev {
println!("Send SMS with Message: {}", msg)
}
})
.build();
async_std::task::block_on(async {
async_mediator.send(UserMessageRequest {
msg: String::from("Hello World"),
priority: 0,
}).await;
async_mediator.send(UserMessageRequest {
msg: String::from("Is Rust Memory Safe?"),
priority: 2,
}).await;
async_mediator.send(UserMessageRequest {
msg: String::from("New Rust Version"),
priority: 8,
}).await;
async_mediator.next().await.ok();
async_mediator.next().await.ok();
async_mediator.next().await.ok();
});
Features
- sync and async (use
async
feature) mediators CxAwareMediator
(useasync
feature, carries a dependency of your choice)- compiler-baked typing
- extensible architecture
Todo
- remove
Clone
bound on eventsEv
forSyncMediatorInternalNext
. - internally, make builders function in an "additive" way.
Contributions
Feel free to open an issue/PR explaining possible improvements or changes.
Help
Also, please do not hesitate and open an issue when needed. I am happy to help!
Dependencies
~0–8.5MB
~89K SLoC