use crossbeam_channel::{bounded, Receiver, Sender};
use crate::message::Message;
use crate::error::SpriteError;
#[derive(Debug)]
pub struct Request {
pub payload: Message,
pub reply_tx: Sender<Response>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Response {
pub payload: Message,
}
impl Request {
pub fn new(payload: Message) -> (Self, Receiver<Response>) {
let (tx, rx) = bounded(1);
(Self { payload, reply_tx: tx }, rx)
}
pub fn reply(&self, msg: Message) -> Result<(), SpriteError> {
self.reply_tx.send(Response { payload: msg })
.map_err(|_| SpriteError::MailboxClosed(0))
}
}
impl Response {
pub fn into_message(self) -> Message { self.payload }
pub fn payload(&self) -> &Message { &self.payload }
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn request_reply_roundtrip() {
let (req, rx) = Request::new(Message::text("ping"));
req.reply(Message::text("pong")).unwrap();
let resp = rx.recv().unwrap();
assert_eq!(resp.payload.as_str(), Some("pong"));
}
}