Skip to main content

sprite_core/
request.rs

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}