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
use std::error::Error as ErrorTrait;
use std::process;
use execution_flow::Error;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Code {
Success = 0,
PistonFailure = 1,
IOFailure = 2,
}
impl From<Code> for i32 {
fn from(code: Code) -> i32 {
code as i32
}
}
pub fn fail_from_error(error: Error) -> ! {
match error {
Error::IO(error) => fail_with_message(Code::IOFailure, error.description()),
Error::Piston(message) => fail_with_message(Code::PistonFailure, &message)
}
}
pub fn fail_with_message(exit_code: Code, message: &str) -> ! {
println!("Error: {description}", description = message);
quit(exit_code)
}
pub fn succeed() -> ! {
quit(Code::Success)
}
fn quit<I: Into<i32>>(code: I) -> ! {
process::exit(code.into())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn exit_code_success() {
assert_eq!(0, Code::Success.into());
}
#[test]
fn exit_code_piston_failure() {
assert_eq!(1, Code::PistonFailure.into());
}
#[test]
fn exit_code_io_failure() {
assert_eq!(2, Code::IOFailure.into());
}
}