pub fn read_message_header<R: AsyncRead>(
reader: Pin<&mut R>,
message_format: MessageFormat,
) -> MessageHeaderReader<'_, R>
Expand description
Reads a message header from streams.
ยงExamples
use std::{
io::Result as IOResult,
pin::pin,
time::Duration
};
use rand::random;
use sheave_core::{
messages::headers::{
MessageHeader,
MessageFormat::*,
MessageType
},
readers::read_message_header
};
#[tokio::main]
async fn main() -> IOResult<()> {
// In case of 11 bytes.
let mut reader: [u8; 11] = [0; 11];
let timestamp = random::<u32>() << 8 >> 8;
let message_length = random::<u32>() << 8 >> 8;
let message_type = random::<u8>();
let message_id = random::<u32>();
reader[..3].copy_from_slice(×tamp.to_be_bytes()[1..]);
reader[3..6].copy_from_slice(&message_length.to_be_bytes()[1..]);
reader[6] = message_type;
reader[7..].copy_from_slice(&message_id.to_le_bytes());
let result = read_message_header(pin!(reader.as_slice()), New).await?;
assert_eq!(Duration::from_millis(timestamp as u64), result.get_timestamp().unwrap());
assert_eq!(message_length, result.get_message_length().unwrap());
assert_eq!(MessageType::from(message_type), result.get_message_type().unwrap());
assert_eq!(message_id, result.get_message_id().unwrap());
// In case of 7 bytes.
let mut reader: [u8; 7] = [0; 7];
let timestamp = random::<u32>() << 8 >> 8;
let message_length = random::<u32>() << 8 >> 8;
let message_type = random::<u8>();
reader[..3].copy_from_slice(×tamp.to_be_bytes()[1..]);
reader[3..6].copy_from_slice(&message_length.to_be_bytes()[1..]);
reader[6] = message_type;
let result = read_message_header(pin!(reader.as_slice()), SameSource).await?;
assert_eq!(Duration::from_millis(timestamp as u64), result.get_timestamp().unwrap());
assert_eq!(message_length, result.get_message_length().unwrap());
assert_eq!(MessageType::from(message_type), result.get_message_type().unwrap());
// In case of 3 bytes.
let mut reader: [u8; 3] = [0; 3];
let timestamp = random::<u32>() << 8 >> 8;
reader.copy_from_slice(×tamp.to_be_bytes()[1..]);
let result = read_message_header(pin!(reader.as_slice()), TimerChange).await?;
assert_eq!(Duration::from_millis(timestamp as u64), result.get_timestamp().unwrap());
// In case of 0 bytes. (Continue)
let mut reader: [u8; 0] = [0; 0];
let result = read_message_header(pin!(reader.as_slice()), Continue).await?;
assert!(result.get_timestamp().is_none());
Ok(())
}
If message format is 3 (Continue), you are unnecessary to read message header because it has no data.