1use crossbeam::channel::Receiver;
2use std::{
3 fs::File,
4 io::{self, BufWriter, ErrorKind, Result, Write},
5};
6
7pub fn write_loop(outfile: &str, write_rx: Receiver<Vec<u8>>) -> Result<()> {
8 let mut writer: Box<dyn Write> = if !outfile.is_empty() {
9 Box::new(BufWriter::new(File::create(outfile)?))
10 } else {
11 Box::new(BufWriter::new(io::stdout()))
12 };
13
14 loop {
15 let buffer = write_rx.recv().unwrap();
16 if buffer.is_empty() {
17 break;
18 }
19 if let Err(e) = writer.write_all(&buffer) {
20 if e.kind() == ErrorKind::BrokenPipe {
21 return Ok(());
22 }
23 return Err(e);
24 }
25 }
26
27 Ok(())
28}