pipeviewer_exercise/
write.rs1use 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 return Ok(());
21 }
22 return Err(e);
23 };
24 }
25
26 Ok(())
27}