ex-cli 1.21.0

Command line tool to find, filter, sort and list files.
Documentation
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))
    }
}