sheave_core/messages/headers/
message.rs

1mod message_type;
2
3use std::time::Duration;
4pub use self::message_type::*;
5
6/// Indicates a chunk datum format and which stream is it into.
7///
8/// This header has 4 types.
9///
10/// |Total|Timestamp|Message Length|Message Type|Message ID|
11/// | -: | -: | -: | -: | -: |
12/// |11|3|3|1|4|
13/// |7 |3|3|1| |
14/// |3 |3| | | |
15/// |0 | | | | |
16///
17/// The unit of every length item is bytes.
18///
19/// * 11 bytes type is required when a new message ID is necessary, that is, communicating with a partner on a new message stream.
20/// * 7 bytes type is required when a message which is different either type or length, sends/receives on same message stream.
21/// * 3 bytes type is required when a message which is same both type and length, sends/receives on same message stream.
22/// * 0 bytes type is required when concatenates a message which is same both type and length, but exceeding the chunk size on same message stream.
23///
24/// Note that 0 bytes type is required to consider of the message length because can be contained into its chunk datum.
25///
26/// tuples are convertible into message headers.
27///
28/// |Tuples|Message Header Format|
29/// | :- | :- |
30/// |`(Duration, u32, u8, u32)`|`New`|
31/// |`(Duration, u32, u8)|`SameSource`|
32/// |`Duration`|`TimerChange`|
33/// |`()`|`Continue`|
34///
35/// # Examples
36///
37/// ```rust
38/// use std::time::Duration;
39/// use sheave_core::messages::headers::MessageHeader;
40///
41/// let new: MessageHeader = (Duration::default(), u32::default(), u8::default().into(), u32::default()).into();
42/// assert!(new.get_message_id().is_some());
43///
44/// let same_source: MessageHeader = (Duration::default(), u32::default(), u8::default().into()).into();
45/// assert!(same_source.get_message_length().is_some());
46/// assert!(same_source.get_message_type().is_some());
47///
48/// let timer_change: MessageHeader = Duration::default().into();
49/// assert!(timer_change.get_timestamp().is_some());
50///
51/// let cont: MessageHeader = ().into();
52/// assert!(cont.get_timestamp().is_none())
53/// ```
54#[derive(Debug, Clone, Copy, Default)]
55pub struct MessageHeader {
56    timestamp: Option<Duration>,
57    message_length: Option<u32>,
58    message_type: Option<MessageType>,
59    message_id: Option<u32>
60}
61
62impl MessageHeader {
63    /// Gets a timestamp.
64    ///
65    /// Only 0 bytes type returns `None`.
66    ///
67    /// # Examples
68    ///
69    /// ```rust
70    /// use std::time::Duration;
71    /// use sheave_core::messages::headers::MessageHeader;
72    ///
73    /// // In case of 11 bytes type.
74    /// let new: MessageHeader = (Duration::default(), u32::default(), u8::default().into(), u32::default()).into();
75    /// assert!(new.get_timestamp().is_some());
76    ///
77    /// // In case of 7 bytes type.
78    /// let same_source: MessageHeader = (Duration::default(), u32::default(), u8::default().into()).into();
79    /// assert!(same_source.get_timestamp().is_some());
80    ///
81    /// // In case of 3 bytes type.
82    /// let timer_change: MessageHeader = Duration::default().into();
83    /// assert!(timer_change.get_timestamp().is_some());
84    /// 
85    /// // In case of 0 bytes type.
86    /// let cont: MessageHeader = ().into();
87    /// assert!(cont.get_timestamp().is_none())
88    /// ```
89    pub fn get_timestamp(&self) -> Option<Duration> {
90        self.timestamp
91    }
92
93    /// Gets a message length.
94    ///
95    /// 0 bytes type and 3 bytes type return `None`.
96    ///
97    /// # Examples
98    ///
99    /// ```rust
100    /// use std::time::Duration;
101    /// use sheave_core::messages::headers::MessageHeader;
102    ///
103    /// // In case of 11 bytes type.
104    /// let new: MessageHeader = (Duration::default(), u32::default(), u8::default().into(), u32::default()).into();
105    /// assert!(new.get_message_length().is_some());
106    ///
107    /// // In case of 7 bytes type.
108    /// let same_source: MessageHeader = (Duration::default(), u32::default(), u8::default().into()).into();
109    /// assert!(same_source.get_message_length().is_some());
110    ///
111    /// // In case of 3 bytes type.
112    /// let timer_change: MessageHeader = Duration::default().into();
113    /// assert!(timer_change.get_message_length().is_none());
114    ///
115    /// // In case of 0 bytes type.
116    /// let cont: MessageHeader = ().into();
117    /// assert!(cont.get_message_length().is_none())
118    /// ```
119    pub fn get_message_length(&self) -> Option<u32> {
120        self.message_length
121    }
122
123    /// Gets a message type.
124    ///
125    /// 0 bytes type and 3 bytes type return `None`.
126    ///
127    /// # Examples
128    ///
129    /// ```rust
130    /// use std::time::Duration;
131    /// use sheave_core::messages::headers::MessageHeader;
132    ///
133    /// // In case of 11 bytes type.
134    /// let new: MessageHeader = (Duration::default(), u32::default(), u8::default().into(), u32::default()).into();
135    /// assert!(new.get_message_type().is_some());
136    ///
137    /// // In case of 7 bytes type.
138    /// let same_source: MessageHeader = (Duration::default(), u32::default(), u8::default().into()).into();
139    /// assert!(same_source.get_message_type().is_some());
140    ///
141    /// // In case of 3 bytes type.
142    /// let timer_change: MessageHeader = Duration::default().into();
143    /// assert!(timer_change.get_message_type().is_none());
144    ///
145    /// // In case of 0 bytes type.
146    /// let cont: MessageHeader = ().into();
147    /// assert!(cont.get_message_type().is_none())
148    /// ```
149    pub fn get_message_type(&self) -> Option<MessageType> {
150        self.message_type
151    }
152
153    /// Gets a message ID.
154    ///
155    /// All but 11 bytes type returns `None`.
156    ///
157    /// # Examples
158    ///
159    /// ```rust
160    /// use std::time::Duration;
161    /// use sheave_core::messages::headers::MessageHeader;
162    ///
163    /// // In case of 11 bytes type.
164    /// let new: MessageHeader = (Duration::default(), u32::default(), u8::default().into(), u32::default()).into();
165    /// assert!(new.get_message_id().is_some());
166    ///
167    /// // In case of 7 bytes type.
168    /// let same_source: MessageHeader = (Duration::default(), u32::default(), u8::default().into()).into();
169    /// assert!(same_source.get_message_id().is_none());
170    ///
171    /// // In case of 3 bytes type.
172    /// let timer_change: MessageHeader = Duration::default().into();
173    /// assert!(timer_change.get_message_id().is_none());
174    ///
175    /// // In case of 0 bytes type.
176    /// let cont: MessageHeader = ().into();
177    /// assert!(cont.get_message_id().is_none())
178    /// ```
179    pub fn get_message_id(&self) -> Option<u32> {
180        self.message_id
181    }
182}
183
184impl From<(Duration, u32, MessageType, u32)> for MessageHeader {
185    fn from((timestamp, message_length, message_type, message_id): (Duration, u32, MessageType, u32)) -> Self {
186        Self {
187            timestamp: Some(timestamp),
188            message_length: Some(message_length),
189            message_type: Some(message_type),
190            message_id: Some(message_id)
191        }
192    }
193}
194
195impl From<(Duration, u32, MessageType)> for MessageHeader {
196    fn from((timestamp, message_length, message_type): (Duration, u32, MessageType)) -> Self {
197        Self {
198            timestamp: Some(timestamp),
199            message_length: Some(message_length),
200            message_type: Some(message_type),
201            ..Self::default()
202        }
203    }
204}
205
206impl From<Duration> for MessageHeader {
207    fn from(timestamp: Duration) -> Self {
208        Self {
209            timestamp: Some(timestamp),
210            ..Self::default()
211        }
212    }
213}
214
215impl From<()> for MessageHeader {
216    fn from(_fields: ()) -> Self {
217        Self::default()
218    }
219}
220
221impl From<MessageHeader> for (Option<Duration>, Option<u32>, Option<MessageType>, Option<u32>) {
222    fn from(message_header: MessageHeader) -> Self {
223        (
224            message_header.get_timestamp(),
225            message_header.get_message_length(),
226            message_header.get_message_type(),
227            message_header.get_message_id()
228        )
229    }
230}