cloud-sdk-reqwest 0.30.1

Optional provider-neutral reqwest transport boundary for cloud-sdk.
Documentation
use std::io::Read;

#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub(super) enum ReadBodyError {
    TooLarge,
    ReadFailed,
}

pub(super) fn read_bounded(
    reader: &mut impl Read,
    output: &mut [u8],
) -> Result<usize, ReadBodyError> {
    let mut len = 0_usize;
    while len < output.len() {
        let target = output.get_mut(len..).ok_or(ReadBodyError::ReadFailed)?;
        let read = reader.read(target).map_err(|_| ReadBodyError::ReadFailed)?;
        if read == 0 {
            return Ok(len);
        }
        len = len.checked_add(read).ok_or(ReadBodyError::TooLarge)?;
    }

    let mut probe = [0_u8; 1];
    let extra = reader
        .read(&mut probe)
        .map_err(|_| ReadBodyError::ReadFailed)?;
    if extra == 0 {
        Ok(len)
    } else {
        Err(ReadBodyError::TooLarge)
    }
}