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}