pipeviewer_exercise/
write.rs

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