1use crossbeam_channel::{bounded, Receiver, Sender};
2use crate::message::Message;
3use crate::error::SpriteError;
4
5#[derive(Debug)]
6pub struct Request {
7 pub payload: Message,
8 pub reply_tx: Sender<Response>,
9}
10
11#[derive(Debug, Clone, PartialEq)]
12pub struct Response {
13 pub payload: Message,
14}
15
16impl Request {
17 pub fn new(payload: Message) -> (Self, Receiver<Response>) {
18 let (tx, rx) = bounded(1);
19 (Self { payload, reply_tx: tx }, rx)
20 }
21 pub fn reply(&self, msg: Message) -> Result<(), SpriteError> {
22 self.reply_tx.send(Response { payload: msg })
23 .map_err(|_| SpriteError::MailboxClosed(0))
24 }
25}
26
27impl Response {
28 pub fn into_message(self) -> Message { self.payload }
29 pub fn payload(&self) -> &Message { &self.payload }
30}
31
32#[cfg(test)]
33mod tests {
34 use super::*;
35 #[test]
36 fn request_reply_roundtrip() {
37 let (req, rx) = Request::new(Message::text("ping"));
38 req.reply(Message::text("pong")).unwrap();
39 let resp = rx.recv().unwrap();
40 assert_eq!(resp.payload.as_str(), Some("pong"));
41 }
42}