sheave_core::writers

Function write_message_header

Source
pub fn write_message_header<'a, W: AsyncWrite>(
    writer: Pin<&'a mut W>,
    message_header: &'a MessageHeader,
) -> MessageHeaderWriter<'a, W>
Expand description

Writes a message header into streams.

§Panics

In the specification, timestamps and message lengths are defined as 3 bytes, therefore any value above 0x00ffffff is emitted an assertion error.

§Examples

use std::{
    cmp::min,
    io::Result as IOResult,
    pin::{
        Pin,
        pin
    },
    time::Duration
};
use rand::random;
use sheave_core::{
    messages::headers::{
        MessageHeader,
        MessageType
    },
    writers::write_message_header
};

#[tokio::main]
async fn main() -> IOResult<()> {
    // In case of 11 bytes.
    let mut writer: Pin<&mut Vec<u8>> = pin!(Vec::new());
    let timestamp = Duration::from_millis(min(0x00ffffff, random::<u32>()) as u64);
    let message_length = min(0x00ffffff, random::<u32>());
    let message_type: MessageType = random::<u8>().into();
    let message_id = random::<u32>();
    let message_header = MessageHeader::New((timestamp, message_length, message_type, message_id).into());
    write_message_header(writer.as_mut(), &message_header).await?;
    let mut written: [u8; 4] = [0; 4];
    written[1..].copy_from_slice(&writer[..3]);
    let timestamp = Duration::from_millis(u32::from_be_bytes(written) as u64);
    assert_eq!(timestamp, message_header.get_timestamp().unwrap());
    let mut written: [u8; 4] = [0; 4];
    written[1..].copy_from_slice(&writer[3..6]);
    let message_length = u32::from_be_bytes(written);
    assert_eq!(message_length, message_header.get_message_length().unwrap());
    let message_type: MessageType = writer[6].into();
    assert_eq!(message_type, message_header.get_message_type().unwrap());
    let mut written: [u8; 4] = [0; 4];
    written.copy_from_slice(&writer[7..]);
    let message_id = u32::from_le_bytes(written);
    assert_eq!(message_id, message_header.get_message_id().unwrap());

    // In case of 7 bytes.
    let mut writer: Pin<&mut Vec<u8>> = pin!(Vec::new());
    let timestamp = Duration::from_millis(min(0x00ffffff, random::<u32>()) as u64);
    let message_length = min(0x00ffffff, random::<u32>());
    let message_type: MessageType = random::<u8>().into();
    let message_header = MessageHeader::SameSource((timestamp, message_length, message_type).into());
    write_message_header(writer.as_mut(), &message_header).await?;
    let mut written: [u8; 4] = [0; 4];
    written[1..].copy_from_slice(&writer[..3]);
    let timestamp = Duration::from_millis(u32::from_be_bytes(written) as u64);
    assert_eq!(timestamp, message_header.get_timestamp().unwrap());
    let mut written: [u8; 4] = [0; 4];
    written[1..].copy_from_slice(&writer[3..6]);
    let message_length = u32::from_be_bytes(written);
    assert_eq!(message_length, message_header.get_message_length().unwrap());
    let message_type: MessageType = writer[6].into();
    assert_eq!(message_type, message_header.get_message_type().unwrap());

    // In case of 3 bytes.
    let mut writer: Pin<&mut Vec<u8>> = pin!(Vec::new());
    let timestamp = Duration::from_millis(min(0x00ffffff, random::<u32>()) as u64);
    let message_header = MessageHeader::TimerChange(timestamp.into());
    write_message_header(writer.as_mut(), &message_header).await?;
    let mut written: [u8; 4] = [0; 4];
    written[1..].copy_from_slice(&writer[..3]);
    let timestamp = Duration::from_millis(u32::from_be_bytes(written) as u64);
    assert_eq!(timestamp, message_header.get_timestamp().unwrap());

    // In case of 0 bytes. (Continue)
    let mut writer: Pin<&mut Vec<u8>> = pin!(Vec::new());
    let message_header = MessageHeader::Continue;
    write_message_header(writer.as_mut(), &message_header).await?;
    assert!(writer.is_empty());

    Ok(())
}