     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24

    //! Module providing a helper structure to capture output in subprocesses.

    use std::{
        io,
        io::prelude::Write,
        sync::{Arc, Mutex},
    };

    pub struct Sink(Arc<Mutex<Vec<u8>>>);

    impl Sink {
        pub fn new_boxed(data: &Arc<Mutex<Vec<u8>>>) -> Box<Self> {
            Box::new(Self(data.clone()))
        }
    }

    impl Write for Sink {
        fn write(&mut self, data: &[u8]) -> io::Result<usize> {
            Write::write(&mut *self.0.lock().unwrap(), data)
        }
        fn flush(&mut self) -> io::Result<()> {
            Ok(())
        }
    }