use std::io::{self, Read};
use super::{SpawnedProcess, StdoutState};
impl Read for SpawnedProcess {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
read_via_handle(self, buf)
}
}
impl Read for &SpawnedProcess {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
read_via_handle(self, buf)
}
}
fn read_via_handle(p: &SpawnedProcess, buf: &mut [u8]) -> io::Result<usize> {
let mut guard = p
.stdout
.lock()
.map_err(|_| io::Error::other("stdout mutex poisoned"))?;
if matches!(*guard, StdoutState::NotTaken) {
match p.children.last().and_then(|c| c.take_stdout()) {
Some(pipe) => *guard = StdoutState::Cached(pipe),
None => *guard = StdoutState::GivenAway,
}
}
match &mut *guard {
StdoutState::Cached(pipe) => pipe.read(buf),
StdoutState::NotTaken | StdoutState::GivenAway => Ok(0),
}
}