use std::{ io::{Error, ErrorKind, Result}, process::ExitStatus, }; use nix::sys::wait; pub trait Checkable { fn check(&self) -> Result<()>; } impl Checkable for ExitStatus { fn check(&self) -> Result<()> { if self.success() { Ok(()) } else { Err(Error::new( ErrorKind::Other, format!("Process exited with {}", self), )) } } } impl Checkable for wait::WaitStatus { fn check(&self) -> Result<()> { let message = match self { wait::WaitStatus::Exited(_, 0) => return Ok(()), wait::WaitStatus::Exited(_, code) => format!("Process exited with exit code: {}", code), wait::WaitStatus::Signaled(_, signal, _) => { format!("Process exited with signal: {}", signal) } _ => format!("Process in unexpected status: {:?}", self), }; Err(Error::new(ErrorKind::Other, message)) } }