diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2019-06-15 16:48:40 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2019-06-15 16:48:40 +0200 |
commit | a2433f315d130a2c130010669828b5a49d083b01 (patch) | |
tree | 5f140b8e0378b4e04fd3b46e8a136f436461820b | |
parent | cee7689e77e14e55fb624149cdefe1fe0e1f4e1a (diff) | |
parent | bb4f0ace6b78fd76948f34de049373b02adaa475 (diff) | |
download | imag-a2433f315d130a2c130010669828b5a49d083b01.zip imag-a2433f315d130a2c130010669828b5a49d083b01.tar.gz |
Merge branch 'libimagentryview-propagate-io-errors' into master
-rw-r--r-- | bin/core/imag-view/src/main.rs | 20 | ||||
-rw-r--r-- | bin/domain/imag-diary/src/view.rs | 12 | ||||
-rw-r--r-- | lib/domain/libimagdiary/src/viewer.rs | 4 | ||||
-rw-r--r-- | lib/entry/libimagentryview/src/builtin/editor.rs | 4 | ||||
-rw-r--r-- | lib/entry/libimagentryview/src/builtin/md.rs | 5 | ||||
-rw-r--r-- | lib/entry/libimagentryview/src/builtin/plain.rs | 2 | ||||
-rw-r--r-- | lib/entry/libimagentryview/src/builtin/stdout.rs | 2 | ||||
-rw-r--r-- | lib/entry/libimagentryview/src/error.rs | 66 | ||||
-rw-r--r-- | lib/entry/libimagentryview/src/lib.rs | 1 | ||||
-rw-r--r-- | lib/entry/libimagentryview/src/viewer.rs | 2 |
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 { |