use crate::error::MyResult;
use std::io::Read;
pub fn read_until(
file: &mut dyn Read,
buffer: &mut Vec<u8>,
size: usize,
) -> MyResult<usize> {
if let Some(size) = size.checked_sub(buffer.len()) {
if size > 0 {
file.take(size as u64).read_to_end(buffer)?;
}
}
Ok(buffer.len())
}
#[cfg(test)]
mod tests {
use crate::error::MyResult;
use crate::util::file::read_until;
use pretty_assertions::assert_eq;
use std::io::Cursor;
#[test]
fn test_zero_bytes_are_not_read() -> MyResult<()> {
let (count, buffer) = read_until_multi(vec![0])?;
assert_eq!(count, 0);
assert_eq!(&buffer, b"");
Ok(())
}
#[test]
fn test_counted_bytes_are_partly_read() -> MyResult<()> {
let (count, buffer) = read_until_multi(vec![4])?;
assert_eq!(count, 4);
assert_eq!(&buffer, b"ABCD");
Ok(())
}
#[test]
fn test_counted_bytes_are_fully_read() -> MyResult<()> {
let (count, buffer) = read_until_multi(vec![12])?;
assert_eq!(count, 10);
assert_eq!(&buffer, b"ABCDEFGHIJ");
Ok(())
}
#[test]
fn test_counted_bytes_are_partly_and_partly_read() -> MyResult<()> {
let (count, buffer) = read_until_multi(vec![8, 4])?;
assert_eq!(count, 8);
assert_eq!(&buffer, b"ABCDEFGH");
Ok(())
}
#[test]
fn test_counted_bytes_are_partly_and_fully_read() -> MyResult<()> {
let (count, buffer) = read_until_multi(vec![4, 12])?;
assert_eq!(count, 10);
assert_eq!(&buffer, b"ABCDEFGHIJ");
Ok(())
}
fn read_until_multi(sizes: Vec<usize>) -> MyResult<(usize, Vec<u8>)> {
let mut file = Cursor::new(b"ABCDEFGHIJ".to_vec());
let mut buffer = Vec::new();
let mut count = 0;
for size in sizes {
count = read_until(&mut file, &mut buffer, size)?;
}
Ok((count, buffer))
}
}