use crate::BUF_SIZE;
use crossbeam::channel::Sender;
use std::fs::File;
use std::io::{self, BufReader, Read, Result};
pub fn read_loop(
infile: &str,
tx_to_stats: Sender<usize>,
tx_to_write: Sender<Vec<u8>>,
) -> Result<()> {
let mut databuf = [0; BUF_SIZE];
let mut reader: Box<dyn Read> = if !infile.is_empty() {
Box::new(BufReader::new(File::open(infile)?))
} else {
Box::new(BufReader::new(io::stdin()))
};
loop {
let bytes_read = match reader.read(&mut databuf) {
Ok(0) => break,
Ok(x) => x,
Err(_) => break,
};
let _ = tx_to_stats.send(bytes_read);
if tx_to_write.send(Vec::from(&databuf[..bytes_read])).is_err() {
break;
}
}
let _ = tx_to_stats.send(0);
let _ = tx_to_write.send(Vec::new());
Ok(())
}