sheave_core::readers

Function read_message_header

Source
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(&timestamp.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(&timestamp.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(&timestamp.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.