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
extern crate failure;
use std::{process, io::{stderr, stdout, Write}};
use failure::Error;
pub fn print_causes(e: impl Into<Error>, mut w: impl Write) {
let e = e.into();
let causes = e.causes().collect::<Vec<_>>();
let num_causes = causes.len();
for (index, cause) in causes.iter().enumerate() {
if index == 0 {
writeln!(w, "{}", cause).ok();
if num_causes > 1 {
writeln!(w, "Caused by: ").ok();
}
} else {
writeln!(w, " {}: {}", num_causes - index, cause).ok();
}
}
}
pub fn ok_or_exit<T, E>(r: Result<T, E>) -> T
where
E: Into<Error>,
{
match r {
Ok(r) => r,
Err(e) => {
stdout().flush().ok();
write!(stderr(), "error: ").ok();
print_causes(e, stderr());
process::exit(1);
}
}
}