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 wrapper
//!
//! This object used as main unit of message passing interaction. He may contain any data type and
//! provides he safe shared between threads and concurrent access. This object may be cloned
//! unlimited number of times.
use crate::common::tsafe::TSafe;
use std::any::Any;
use std::sync::{MutexGuard};
/// Wraps any data type to the message wrapper
///
/// # Example
///
/// ```
/// msg!(10);
/// msg!(String::from("xxx");
/// msg!(SomeStructure { });
/// ```
///
#[macro_export]
macro_rules! msg {
($l:expr) => {
{
Message::new(tsafe!($l))
}
};
}
pub struct Message {
/// Wrapped data
pub inner: TSafe<Any + Send>
}
impl Message {
pub fn new(inner: TSafe<Any + Send>) -> Message {
Message {
inner
}
}
/// Returns MutexGuard of an inner message
pub fn get(&self) -> MutexGuard<Any + Send> {
self.inner.lock().unwrap()
}
}
impl Clone for Message {
fn clone(&self) -> Self {
Message {
inner: self.inner.clone()
}
}
}