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