1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
use std::io::{self, ErrorKind, Write}; use std::ops::DerefMut; use std::sync::{Arc, Mutex}; pub struct SynchronizedOptionWriter<W: Write> { inner: Arc<Mutex<Option<W>>>, } impl<W: Write> SynchronizedOptionWriter<W> { #[inline] pub fn new(writer: Arc<Mutex<Option<W>>>) -> SynchronizedOptionWriter<W> { SynchronizedOptionWriter { inner: writer, } } } impl<W: Write> Write for SynchronizedOptionWriter<W> { #[inline] fn write(&mut self, buf: &[u8]) -> Result<usize, io::Error> { match self .inner .lock() .map_err(|err| io::Error::new(ErrorKind::WouldBlock, err.to_string()))? .deref_mut() { Some(writer) => writer.write(buf), None => Err(io::Error::new(ErrorKind::BrokenPipe, "the writer has been removed out")), } } #[inline] fn flush(&mut self) -> Result<(), io::Error> { match self .inner .lock() .map_err(|err| io::Error::new(ErrorKind::WouldBlock, err.to_string()))? .deref_mut() { Some(writer) => writer.flush(), None => Err(io::Error::new(ErrorKind::BrokenPipe, "the writer has been removed out")), } } }