Skip to main content

flo_pv/
write.rs

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}