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 56 57 58 59 60 61 62 63 64 65 66 67
//! //! Macros to use in processes and defining the architecture of runtime. //! /// /// Matches incoming messages to the process. /// Always have a `default` case to execute if unknown message arrives to the process. /// /// # Examples ///```rust ///# use bastion::prelude::*; ///# ///# fn main() { ///# Bastion::platform(); ///# ///# /// Define, calculate or prepare messages to be sent to the processes. ///# let message = String::from("Some message to be passed"); ///# ///# Bastion::spawn( ///# |context: BastionContext, msg: Box<dyn Message>| { ///# /// Message can be selected with receiver here. Take action! ///receive! { msg, /// String => |e| { println!("Received string :: {}", e)}, /// i32 => |e| {println!("Received i32 :: {}", e)}, /// _ => println!("No message as expected. Default") ///} ///# ///# /// Do some processing in body ///# println!("root supervisor - spawn_at_root - 1"); ///# ///# /// Rebind to the system ///# context.hook(); ///# }, ///# message, ///# ); ///# } /// ``` #[macro_export] macro_rules! receive { ( $msg:expr, $($rest:tt)* ) => { receive!(@private $msg, ($($rest)*) -> ()) }; (@private $msg:expr, ($recvty:ty => $clo:expr, _ => $fallback:expr) -> ($($parsed:tt)*) ) => { receive!(@private $msg, () -> ($($parsed)* ($recvty => $clo)) $fallback) }; (@private $msg:expr, ($recvty:ty => $clo:expr, $($rest:tt)*) -> ($($parsed:tt)*) ) => { receive!(@private $msg, ($($rest)*) -> ($($parsed)* ($recvty => $clo))) }; (@private $msg:expr, () -> ($(($recvty:ty => $clo:expr))*) $fallback:expr ) => { { loop { $( let data = objekt::clone_box(&*$msg); if let Receive(Some(o)) = Receive::<$recvty>::from(data) { $clo(o); break } )+ else { $fallback; break } } } }; }