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}