From 39107c529636d5f04d3eb7b2d9ab1f837633b33b Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Wed, 14 Feb 2018 17:10:45 +0100 Subject: [PATCH] Add result extension for translating io errors to exit codes --- lib/core/libimagerror/src/io.rs | 65 ++++++++++++++++++++++++++++++++ lib/core/libimagerror/src/lib.rs | 1 + 2 files changed, 66 insertions(+) create mode 100644 lib/core/libimagerror/src/io.rs diff --git a/lib/core/libimagerror/src/io.rs b/lib/core/libimagerror/src/io.rs new file mode 100644 index 00000000..3b9e74b9 --- /dev/null +++ b/lib/core/libimagerror/src/io.rs @@ -0,0 +1,65 @@ +// +// imag - the personal information management suite for the commandline +// Copyright (C) 2015-2018 the imag contributors +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; version +// 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// + +use std::io::ErrorKind; + +use trace::MapErrTrace; + +pub enum Settings { + Ignore(ErrorKind), + IgnoreAny(Vec), +} + +pub trait ToExitCode : MapErrTrace { + fn to_exit_code(self) -> i32; + fn to_exit_code_with(self, Settings) -> i32; +} + +impl ToExitCode for Result { + + /// Returns an exit code of 0 if the error was a broken pipe, else 1 + fn to_exit_code(self) -> { + self.to_exit_code_with(Settings::ErrorOn(ErrorKind::BrokenPipe)) + } + + /// Returns an exit code depending on the settings + /// + /// Via the settings, errors can be ignores (translates to exit code zero). All other errors + /// are translated into exit code 1 + /// + fn to_exit_code_with(self, settings: Settings) -> i32 { + if let Err(e) = self { + match settings { + Ignore(kind) => if e.kind() == kind { + 0 + } else { + 1 + }, + IgnoreAny(v) => if v.iter().any(|e| e == e.kind()) { + 0 + } else { + 1 + }, + } + } else { + 0 + } + } + +} diff --git a/lib/core/libimagerror/src/lib.rs b/lib/core/libimagerror/src/lib.rs index 204250ac..a09c347c 100644 --- a/lib/core/libimagerror/src/lib.rs +++ b/lib/core/libimagerror/src/lib.rs @@ -37,6 +37,7 @@ extern crate ansi_term; extern crate error_chain; +pub mod io; pub mod trace; pub mod iter; pub mod str;