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
45
46
use bytes::*;
use std::io::Read;
use std::sync::mpsc;
use super::*;
#[derive(Debug)]
pub struct ChildStdout {
pub(super) rx: mpsc::Receiver<Vec<u8>>,
pub(super) buffer: BytesMut,
}
impl ChildStdout {
pub fn new() -> (ChildStdout, mpsc::Sender<Vec<u8>>) {
let (tx_stdout, rx_stdout) = mpsc::channel();
(
ChildStdout {
rx: rx_stdout,
buffer: BytesMut::new(),
},
tx_stdout,
)
}
}
impl Read for ChildStdout {
fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
loop {
if self.buffer.has_remaining() {
let max = self.buffer.remaining().min(buf.len());
buf[0..max].copy_from_slice(&self.buffer[..max]);
self.buffer.advance(max);
return Ok(max);
} else {
match self.rx.recv() {
Ok(data) => {
self.buffer.extend_from_slice(&data[..]);
}
Err(mpsc::RecvError) => {
return Ok(0usize);
}
}
}
}
}
}