summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2019-06-15 16:48:40 +0200
committerMatthias Beyer <mail@beyermatthias.de>2019-06-15 16:48:40 +0200
commita2433f315d130a2c130010669828b5a49d083b01 (patch)
tree5f140b8e0378b4e04fd3b46e8a136f436461820b
parentcee7689e77e14e55fb624149cdefe1fe0e1f4e1a (diff)
parentbb4f0ace6b78fd76948f34de049373b02adaa475 (diff)
Merge branch 'libimagentryview-propagate-io-errors' into master
-rw-r--r--bin/core/imag-view/src/main.rs20
-rw-r--r--bin/domain/imag-diary/src/view.rs12
-rw-r--r--lib/domain/libimagdiary/src/viewer.rs4
-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
10 files changed, 101 insertions, 17 deletions
diff --git a/bin/core/imag-view/src/main.rs b/bin/core/imag-view/src/main.rs
index b79ce3f..32377c3 100644
--- a/bin/core/imag-view/src/main.rs
+++ b/bin/core/imag-view/src/main.rs
@@ -209,9 +209,9 @@ fn main() {
.map(|s| writeln!(outlock, "{}", s).to_exit_code().unwrap_or_exit());
}
- viewer
- .view_entry(&entry, &mut outlock)
- .map_err_trace_exit_unwrap();
+ if let Err(e) = viewer.view_entry(&entry, &mut outlock) {
+ handle_error(e);
+ }
rt.report_touched(entry.get_location()).unwrap_or_exit();
});
@@ -243,9 +243,9 @@ fn main() {
.map(|s| writeln!(outlock, "{}", s).to_exit_code().unwrap_or_exit());
}
- viewer
- .view_entry(&entry, &mut outlock)
- .map_err_trace_exit_unwrap();
+ if let Err(e) = viewer.view_entry(&entry, &mut outlock) {
+ handle_error(e);
+ }
rt.report_touched(entry.get_location()).unwrap_or_exit();
});
@@ -285,3 +285,11 @@ fn create_tempfile_for<'a>(entry: &FileLockEntry<'a>, view_header: bool, hide_co
(tmpfile, file_path)
}
+fn handle_error(e: ::libimagentryview::error::Error) {
+ use libimagentryview::error::Error;
+ match e {
+ Error::Io(e) => Err(e).to_exit_code().unwrap_or_exit(),
+ Error::Other(e) => Err(e).map_err_trace_exit_unwrap()
+ }
+}
+
diff --git a/bin/domain/imag-diary/src/view.rs b/bin/domain/imag-diary/src/view.rs
index 9acab80..23855df 100644
--- a/bin/domain/imag-diary/src/view.rs
+++ b/bin/domain/imag-diary/src/view.rs
@@ -23,9 +23,11 @@ use libimagrt::runtime::Runtime;
use libimagerror::trace::MapErrTrace;
use libimagerror::iter::TraceIterator;
use libimagerror::exit::ExitUnwrap;
+use libimagerror::io::ToExitCode;
use libimagutil::warn_exit::warn_exit;
use libimagstore::iter::get::StoreIdGetIteratorExtension;
use libimagentryview::viewer::Viewer;
+use libimagentryview::error::Error;
use crate::util::get_diary_name;
@@ -49,7 +51,13 @@ pub fn view(rt: &Runtime) {
});
let out = rt.stdout();
- DV::new(hdr).view_entries(entries, &mut out.lock())
- .map_err_trace_exit_unwrap();
+ let mut outlock = out.lock();
+
+ if let Err(e) = DV::new(hdr).view_entries(entries, &mut outlock) {
+ match e {
+ Error::Io(e) => Err(e).to_exit_code().unwrap_or_exit(),
+ Error::Other(e) => Err(e).map_err_trace_exit_unwrap()
+ }
+ }
}
diff --git a/lib/domain/libimagdiary/src/viewer.rs b/lib/domain/libimagdiary/src/viewer.rs
index 7b5e699..f440766 100644
--- a/lib/domain/libimagdiary/src/viewer.rs
+++ b/lib/domain/libimagdiary/src/viewer.rs
@@ -22,14 +22,14 @@
use std::io::Write;
use std::ops::Deref;
-use failure::Fallible as Result;
use failure::ResultExt;
use failure::err_msg;
-use failure::Error;
use libimagstore::store::Entry;
use libimagentryview::viewer::Viewer;
use libimagentryview::builtin::plain::PlainViewer;
+use libimagentryview::error::Error;
+use libimagentryview::error::Result;
use crate::entry::DiaryEntry;
/// This viewer does _not_ implement libimagentryview::viewer::Viewer because we need to be able to
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 c7ca0ae..11237fb 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 {