use std::{cmp, io, str};
use std::fs::File;
use std::io::Read;
use std::path::PathBuf;
use read_buffer::ReadBuffer;
struct ChunkedReadAdapter<T: Read> (T);
impl<T: Read> Read for ChunkedReadAdapter<T> {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
let bytes_to_read = cmp::min(7, buf.len());
self.0.read(&mut buf[..bytes_to_read])
}
}
fn main() -> Result<(), io::Error> {
let mut path: PathBuf = env!("CARGO_MANIFEST_DIR").into();
path.push("examples");
path.push("some_text.txt");
let file = File::open(path)?;
let mut reader = ChunkedReadAdapter(file);
let mut buffer: ReadBuffer<512> = ReadBuffer::new();
let read_data = buffer.read_while(&mut reader, |chunk| {
!chunk.contains(&b'\n')
})?;
let string = str::from_utf8(read_data)
.map_err(|err| io::Error::new(io::ErrorKind::InvalidData, err))?;
let first_line = string.lines().next()
.ok_or(io::Error::from(io::ErrorKind::InvalidData))?;
println!("First line: {:?}", first_line);
println!("All read data: {:?}", string);
Ok(())
}