Abstract exit code as a type

This commit is contained in:
Matthias Beyer 2018-02-14 18:07:11 +01:00
parent eb2f6fbbe2
commit 6a341d3723
3 changed files with 18 additions and 7 deletions

View file

@ -140,7 +140,7 @@ fn show(rt: &Runtime) {
text = e.get_content()) text = e.get_content())
.to_exit_code() .to_exit_code()
}) })
.collect::<Result<(), i32>>() .collect::<Result<Vec<()>, _>>()
.unwrap_or_exit(); .unwrap_or_exit();
} }
} }

View file

@ -17,13 +17,21 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
// //
pub struct ExitCode(i32);
impl From<i32> for ExitCode {
fn from(i: i32) -> ExitCode {
ExitCode(i)
}
}
pub trait ExitUnwrap<T> { pub trait ExitUnwrap<T> {
fn unwrap_or_exit(self) -> T; fn unwrap_or_exit(self) -> T;
} }
impl<T> ExitUnwrap<T> for Result<T, i32> { impl<T, E: Into<ExitCode>> ExitUnwrap<T> for Result<T, E> {
fn unwrap_or_exit(self) -> T { fn unwrap_or_exit(self) -> T {
self.unwrap_or_else(|e| ::std::process::exit(e)) self.map_err(Into::into).unwrap_or_else(|e| ::std::process::exit(e.0))
} }
} }

View file

@ -19,20 +19,22 @@
use std::io::ErrorKind; use std::io::ErrorKind;
use exit::ExitCode;
pub enum Settings { pub enum Settings {
Ignore(ErrorKind), Ignore(ErrorKind),
IgnoreAny(Vec<ErrorKind>), IgnoreAny(Vec<ErrorKind>),
} }
pub trait ToExitCode<T> { pub trait ToExitCode<T> {
fn to_exit_code(self) -> Result<T, i32>; fn to_exit_code(self) -> Result<T, ExitCode>;
fn to_exit_code_with(self, Settings) -> Result<T, i32>; fn to_exit_code_with(self, Settings) -> Result<T, ExitCode>;
} }
impl<T> ToExitCode<T> for Result<T, ::std::io::Error> { impl<T> ToExitCode<T> for Result<T, ::std::io::Error> {
/// Returns an exit code of 0 if the error was a broken pipe, else 1 /// Returns an exit code of 0 if the error was a broken pipe, else 1
fn to_exit_code(self) -> Result<T, i32> { fn to_exit_code(self) -> Result<T, ExitCode> {
self.to_exit_code_with(Settings::Ignore(ErrorKind::BrokenPipe)) self.to_exit_code_with(Settings::Ignore(ErrorKind::BrokenPipe))
} }
@ -41,7 +43,7 @@ impl<T> ToExitCode<T> for Result<T, ::std::io::Error> {
/// Via the settings, errors can be ignores (translates to exit code zero). All other errors /// Via the settings, errors can be ignores (translates to exit code zero). All other errors
/// are translated into exit code 1 /// are translated into exit code 1
/// ///
fn to_exit_code_with(self, settings: Settings) -> Result<T, i32> { fn to_exit_code_with(self, settings: Settings) -> Result<T, ExitCode> {
self.map_err(move |e| match settings { self.map_err(move |e| match settings {
Settings::Ignore(kind) => if e.kind() == kind { Settings::Ignore(kind) => if e.kind() == kind {
0 0
@ -54,6 +56,7 @@ impl<T> ToExitCode<T> for Result<T, ::std::io::Error> {
1 1
}, },
}) })
.map_err(ExitCode::from)
} }
} }