use std::borrow::BorrowMut;
use std::error;
use std::fmt;
use std::fmt::{Display, Formatter};
use std::io;
use std::process::Child;
pub fn wait_proc(mut proc: impl BorrowMut<Child>) -> Result<(), Error> {
let status = proc.borrow_mut().wait().map_err(Error::Wait)?;
match status.code() {
Some(0) => Ok(()),
Some(code) => Err(Error::NonZeroExitCode(code)),
None => Err(Error::KilledBySignal),
}
}
#[non_exhaustive]
#[derive(Debug)]
pub enum Error {
StdinNotPiped,
KilledBySignal,
NonZeroExitCode(i32),
Input(io::Error),
Output(io::Error),
Spawn(io::Error),
Wait(io::Error),
}
impl Display for Error {
fn fmt(&self, fmt: &mut Formatter<'_>) -> Result<(), fmt::Error> {
write!(fmt, "{self:?}")
}
}
impl error::Error for Error {}
pub trait Pool {
fn get(&mut self) -> Result<&mut Child, Error>;
fn join(&mut self) -> Result<(), Error>;
}