summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2019-05-30 10:04:56 +0200
committerMatthias Beyer <mail@beyermatthias.de>2019-05-30 10:04:56 +0200
commit54fdfdb710738cb0b93a4a3e334f90e243ac3edd (patch)
tree00287e8dd7a862d9332ad5fb04a81fb6d6672800
parentb1330c9916453073a32d429346bd3c0125dd6a45 (diff)
Change interface of Viewer to propagate io errorslibimagentryview-propagate-io-errors
Because we need to catch errors that are caused by a borken pipe when writing to stdout (for example), this patch changes the interface of the Viewer trait to return an error enum that can be used to check whether an IO error happened. The calling code can then decide whether to ignore a broken pipe error or whether to handle it properly. Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r--lib/entry/libimagentryview/src/builtin/editor.rs4
-rw-r--r--lib/entry/libimagentryview/src/builtin/md.rs5
-rw-r--r--lib/entry/libimagentryview/src/builtin/plain.rs2
-rw-r--r--lib/entry/libimagentryview/src/builtin/stdout.rs2
-rw-r--r--lib/entry/libimagentryview/src/error.rs66
-rw-r--r--lib/entry/libimagentryview/src/lib.rs1
-rw-r--r--lib/entry/libimagentryview/src/viewer.rs2
7 files changed, 75 insertions, 7 deletions
diff --git a/lib/entry/libimagentryview/src/builtin/editor.rs b/lib/entry/libimagentryview/src/builtin/editor.rs
index 3584564..9c4bdaf 100644
--- a/lib/entry/libimagentryview/src/builtin/editor.rs
+++ b/lib/entry/libimagentryview/src/builtin/editor.rs
@@ -24,9 +24,9 @@ use libimagrt::runtime::Runtime;
use libimagentryedit::edit::edit_in_tmpfile;
use crate::viewer::Viewer;
-use failure::Fallible as Result;
+use crate::error::Result;
+use crate::error::Error;
use failure::ResultExt;
-use failure::Error;
pub struct EditorView<'a>(&'a Runtime<'a>);
diff --git a/lib/entry/libimagentryview/src/builtin/md.rs b/lib/entry/libimagentryview/src/builtin/md.rs
index 1b977e5..3434c1d 100644
--- a/lib/entry/libimagentryview/src/builtin/md.rs
+++ b/lib/entry/libimagentryview/src/builtin/md.rs
@@ -27,8 +27,8 @@ use pulldown_cmark::Parser;
use syntect::parsing::SyntaxSet;
use crate::viewer::Viewer;
-use failure::Fallible as Result;
-use failure::Error;
+use crate::error::Result;
+use crate::error::Error;
pub struct MarkdownViewer<'a> {
rt: &'a Runtime<'a>,
@@ -66,6 +66,7 @@ impl<'a> Viewer for MarkdownViewer<'a> {
self.resource_access.clone(),
syntax_set)
.map_err(|e| e.compat())
+ .map_err(::failure::Error::from)
.map_err(Error::from)
}
}
diff --git a/lib/entry/libimagentryview/src/builtin/plain.rs b/lib/entry/libimagentryview/src/builtin/plain.rs
index 58b1ff4..12da248 100644
--- a/lib/entry/libimagentryview/src/builtin/plain.rs
+++ b/lib/entry/libimagentryview/src/builtin/plain.rs
@@ -22,7 +22,7 @@ use std::io::Write;
use libimagstore::store::Entry;
use crate::viewer::Viewer;
-use failure::Fallible as Result;
+use crate::error::Result;
pub struct PlainViewer {
show_header: bool
diff --git a/lib/entry/libimagentryview/src/builtin/stdout.rs b/lib/entry/libimagentryview/src/builtin/stdout.rs
index a22eba0..79704bc 100644
--- a/lib/entry/libimagentryview/src/builtin/stdout.rs
+++ b/lib/entry/libimagentryview/src/builtin/stdout.rs
@@ -24,7 +24,7 @@ use libimagstore::store::Entry;
use toml::ser::to_string;
use crate::viewer::Viewer;
-use failure::Fallible as Result;
+use crate::error::Result;
pub struct StdoutViewer {
view_header: bool,
diff --git a/lib/entry/libimagentryview/src/error.rs b/lib/entry/libimagentryview/src/error.rs
new file mode 100644
index 0000000..668f219
--- /dev/null
+++ b/lib/entry/libimagentryview/src/error.rs
@@ -0,0 +1,66 @@
+//
+// imag - the personal information management suite for the commandline
+// Copyright (C) 2015-2019 Matthias Beyer <mail@beyermatthias.de> and 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::fmt::Display;
+use std::fmt::Debug;
+
+use failure::Fail;
+
+#[derive(Debug)]
+pub enum Error {
+ Io(::std::io::Error),
+ Other(::failure::Error),
+}
+
+impl Display for Error {
+ fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+ match self {
+ Error::Io(e) => write!(f, "{}", e),
+ Error::Other(e) => write!(f, "{}", e),
+ }
+ }
+}
+
+impl Fail for Error {
+ /* empty */
+}
+
+impl From<::std::io::Error> for Error {
+ fn from(ioe: ::std::io::Error) -> Self {
+ Error::Io(ioe)
+ }
+}
+
+impl From<::failure::Error> for Error {
+ fn from(fe: ::failure::Error) -> Self {
+ Error::Other(fe)
+ }
+}
+
+impl<D> From<::failure::Context<D>> for Error
+ where D: Debug + Display + Send + Sync
+{
+ fn from(ctx: ::failure::Context<D>) -> Self {
+ Error::Other(ctx.into())
+ }
+}
+
+/// Convenient helper type
+pub type Result<T> = ::std::result::Result<T, Error>;
+
diff --git a/lib/entry/libimagentryview/src/lib.rs b/lib/entry/libimagentryview/src/lib.rs
index 7fc1538..e3459b7 100644
--- a/lib/entry/libimagentryview/src/lib.rs
+++ b/lib/entry/libimagentryview/src/lib.rs
@@ -56,5 +56,6 @@ extern crate libimagerror;
extern crate libimagentryedit;
pub mod builtin;
+pub mod error;
pub mod viewer;
diff --git a/lib/entry/libimagentryview/src/viewer.rs b/lib/entry/libimagentryview/src/viewer.rs
index 7e113da..07b2258 100644
--- a/lib/entry/libimagentryview/src/viewer.rs
+++ b/lib/entry/libimagentryview/src/viewer.rs
@@ -22,7 +22,7 @@ use std::ops::Deref;
use libimagstore::store::Entry;
-use failure::Fallible as Result;
+use crate::error::Result;
pub trait Viewer {