sprite-core 0.1.7

Sprite Engine — a fault-tolerant actor runtime for Rust
Documentation
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"));
    }
}