use meslin::{mpmc, From, Message, Request, SendsExt, TryInto};
#[derive(Debug, From, Message)]
#[from(forward)]
struct MyMessage(String);
#[derive(Debug, From, TryInto)]
enum MyProtocol {
Number(i32),
Message(MyMessage),
Request(Request<i32, String>),
}
#[tokio::main]
async fn main() {
let (sender, receiver) = mpmc::unbounded::<MyProtocol>();
tokio::task::spawn(receive_messages(receiver));
sender.send::<i32>(42).await.unwrap();
sender.send::<MyMessage>("Hello").await.unwrap();
let rx = sender.send::<Request<i32, String>>(42).await.unwrap();
let reply = rx.await.unwrap();
assert_eq!(reply, "The number is 42");
let reply = sender.request::<Request<i32, String>>(42).await.unwrap();
assert_eq!(reply, "The number is 42");
}
async fn receive_messages(receiver: mpmc::Receiver<MyProtocol>) {
while let Ok(msg) = receiver.recv_async().await {
match msg {
MyProtocol::Number(msg) => {
println!("Received number: {msg:?}");
}
MyProtocol::Message(msg) => {
println!("Received message: {msg:?}");
}
MyProtocol::Request(Request { msg, tx }) => {
println!("Received request: {msg:?}");
tx.send(format!("The number is {}", msg)).ok();
}
}
}
}