sheave_core::readers

Function read_chunk_data

Source
pub fn read_chunk_data<'a, R: AsyncRead>(
    reader: Pin<&'a mut R>,
    chunk_size: ChunkSize,
    message_length: u32,
) -> ChunkDataReader<'a, R>
Expand description

Reads a chunk data from streams.

If a chunk data exceeds specified chunk size, to insert continue headers between chunk data per chunk size is required. Note the message length doesn’t count their headers.

§Examples

use std::{
    io::Result as IOResult,
    pin::pin
};
use rand::{
    Fill,
    random,
    thread_rng
};
use sheave_core::{
    messages::{
        ChunkSize,
        headers::MessageFormat
    },
    readers::read_chunk_data
};

#[tokio::main]
async fn main() -> IOResult<()> {
    let chunk_size = ChunkSize::default();

    // When it's just one chunk.
    let mut reader: [u8; 128] = [0; 128];
    reader.try_fill(&mut thread_rng()).unwrap();
    let result = read_chunk_data(pin!(reader.as_slice()), chunk_size, 128).await?;
    assert_eq!(128, result.len());

    // When it has the one byte header.
    let mut reader: [u8; 257] = [0; 257];
    let mut part: [u8; 128] = [0; 128];
    part.try_fill(&mut thread_rng()).unwrap();
    reader[..128].copy_from_slice(&part);
    reader[128] = u8::from(MessageFormat::Continue) << 6 | 2;
    reader[129..].copy_from_slice(&part);
    let result = read_chunk_data(pin!(reader.as_slice()), chunk_size, 256).await?;
    assert_eq!(256, result.len());

    // When it has the two bytes header.
    let mut reader: [u8; 258] = [0; 258];
    let mut part: [u8; 128] = [0; 128];
    part.try_fill(&mut thread_rng()).unwrap();
    reader[..128].copy_from_slice(&part);
    reader[128] = u8::from(MessageFormat::Continue) << 6;
    reader[129] = 2;
    reader[130..].copy_from_slice(&part);
    let result = read_chunk_data(pin!(reader.as_slice()), chunk_size, 256).await?;
    assert_eq!(256, result.len());

    // When it has the three bytes header.
    let mut reader: [u8; 259] = [0; 259];
    let mut part: [u8; 128] = [0; 128];
    part.try_fill(&mut thread_rng()).unwrap();
    reader[..128].copy_from_slice(&part);
    reader[128] = u8::from(MessageFormat::Continue) << 6 | 1;
    reader[129..131].copy_from_slice(&2u16.to_le_bytes());
    reader[131..].copy_from_slice(&part);
    let result = read_chunk_data(pin!(reader.as_slice()), chunk_size, 256).await?;
    assert_eq!(256, result.len());

    Ok(())
}