1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
//! **Message responses using regular [lunatic] processes.**
//!
//! Regular lunatic processes don't typically support sending responses in messages.
//! This library provides a type [`MessageRequest`] which adds support for replying back with a value.
//!
//! Interally, it uses a [Tag](lunatic::Tag) to create a temporary mailbox which waits for a message on the generated request tag.
//!
//! [lunatic]: https://crates.io/crates/lunatic
//!
//! # Example
//!
//! ```
//! use lunatic::spawn_link;
//! use lunatic_message_request::{MessageRequest, ProcessRequest};
//! use serde::{Deserialize, Serialize};
//!
//! #[derive(Serialize, Deserialize)]
//! enum Message {
//! Inc,
//! Dec,
//! Count(MessageRequest<(), i32>),
//! }
//!
//! let counter = spawn_link!(|mailbox: Mailbox<Message>| {
//! let mut count = 0;
//!
//! loop {
//! let msg = mailbox.receive();
//! match msg {
//! Message::Inc => count += 1,
//! Message::Dec => count -= 1,
//! Message::Count(req) => req.reply(count),
//! }
//! }
//! });
//!
//! // Initial count should be 0
//! let count = counter.request(Message::Count, ());
//! assert_eq!(count, 0);
//!
//! // Increment count
//! counter.send(Message::Inc);
//!
//! // Count should now be 1
//! let count = counter.request(Message::Count, ());
//! assert_eq!(count, 1);
//! ```
#![warn(missing_docs)]
mod message_request;
mod tagged_mailbox;
pub use message_request::*;
pub use tagged_mailbox::*;