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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
use future::{Async, EnvFuture, Poll};
use futures::Future;
use std::fmt;
use std::process;
use void::Void;
pub const EXIT_SUCCESS: ExitStatus = ExitStatus::Code(0);
pub const EXIT_ERROR: ExitStatus = ExitStatus::Code(1);
pub const EXIT_CMD_NOT_EXECUTABLE: ExitStatus = ExitStatus::Code(126);
pub const EXIT_CMD_NOT_FOUND: ExitStatus = ExitStatus::Code(127);
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
pub enum ExitStatus {
Code(i32),
Signal(i32),
}
impl ExitStatus {
pub fn success(&self) -> bool {
*self == EXIT_SUCCESS
}
}
impl fmt::Display for ExitStatus {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
ExitStatus::Code(code) => write!(f, "exit code: {}", code),
ExitStatus::Signal(code) => write!(f, "signal: {}", code),
}
}
}
impl From<process::ExitStatus> for ExitStatus {
fn from(exit: process::ExitStatus) -> ExitStatus {
#[cfg(unix)]
fn get_signal(exit: process::ExitStatus) -> Option<i32> {
::std::os::unix::process::ExitStatusExt::signal(&exit)
}
#[cfg(windows)]
fn get_signal(_exit: process::ExitStatus) -> Option<i32> {
None
}
match exit.code() {
Some(code) => ExitStatus::Code(code),
None => get_signal(exit).map_or(EXIT_ERROR, ExitStatus::Signal),
}
}
}
impl<E: ?Sized> EnvFuture<E> for ExitStatus {
type Item = Self;
type Error = Void;
fn poll(&mut self, _env: &mut E) -> Poll<Self::Item, Self::Error> {
Ok(Async::Ready(*self))
}
fn cancel(&mut self, _env: &mut E) {
}
}
impl Future for ExitStatus {
type Item = Self;
type Error = Void;
fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
Ok(Async::Ready(*self))
}
}