humphrey 0.7.0

A Performance-Focused, Dependency-Free Web Server.
Documentation
#![allow(dead_code)]

use std::collections::VecDeque;
use std::io::Read;

#[cfg(feature = "tokio")]
use tokio::io::AsyncRead;

pub struct MockStream {
    data: VecDeque<u8>,
}

impl MockStream {
    pub fn with_data(data: VecDeque<u8>) -> Self {
        Self { data }
    }
}

impl Read for MockStream {
    fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
        let mut bytes_written: usize = 0;

        for byte in buf {
            if let Some(new_byte) = self.data.pop_front() {
                *byte = new_byte;
                bytes_written += 1;
            } else {
                return std::io::Result::Ok(bytes_written);
            }
        }

        std::io::Result::Ok(bytes_written)
    }
}

#[cfg(feature = "tokio")]
impl AsyncRead for MockStream {
    fn poll_read(
        mut self: std::pin::Pin<&mut Self>,
        _cx: &mut std::task::Context<'_>,
        buf: &mut tokio::io::ReadBuf<'_>,
    ) -> std::task::Poll<std::io::Result<()>> {
        let mut bytes_written: usize = 0;

        for byte in buf.initialize_unfilled() {
            if let Some(new_byte) = self.data.pop_front() {
                *byte = new_byte;
                bytes_written += 1;
            } else {
                buf.advance(bytes_written);
                return std::task::Poll::Ready(std::io::Result::Ok(()));
            }
        }

        buf.advance(bytes_written);
        std::task::Poll::Ready(std::io::Result::Ok(()))
    }
}