#![deny(missing_docs, warnings)]
#![doc(html_root_url = "https://docs.rs/wait-timeout/0.1")]
extern crate libc;
use std::fmt;
use std::io;
use std::process::Child;
use std::time::Duration;
#[derive(Eq, PartialEq, Copy, Clone, Debug)]
pub struct ExitStatus(imp::ExitStatus);
#[cfg(unix)] #[path = "unix.rs"]
mod imp;
#[cfg(windows)] #[path = "windows.rs"]
mod imp;
pub trait ChildExt {
#[doc(hidden)]
fn wait_timeout_ms(&mut self, ms: u32) -> io::Result<Option<ExitStatus>> {
self.wait_timeout(Duration::from_millis(ms as u64))
}
fn wait_timeout(&mut self, dur: Duration) -> io::Result<Option<ExitStatus>>;
}
impl ChildExt for Child {
fn wait_timeout(&mut self, dur: Duration) -> io::Result<Option<ExitStatus>> {
imp::wait_timeout(self, dur).map(|m| m.map(ExitStatus))
}
}
impl ExitStatus {
pub fn success(&self) -> bool {
self.0.success()
}
pub fn code(&self) -> Option<i32> {
self.0.code()
}
pub fn unix_signal(&self) -> Option<i32> {
self.0.unix_signal()
}
}
impl fmt::Display for ExitStatus {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if let Some(c) = self.code() {
write!(f, "exit code: {}", c)
} else if let Some(s) = self.unix_signal() {
write!(f, "signal: {}", s)
} else {
write!(f, "exit status: unknown")
}
}
}