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