Merge branch 'libimagentryview-propagate-io-errors' into master

This commit is contained in:
Matthias Beyer 2019-06-15 16:48:40 +02:00
commit a2433f315d
10 changed files with 101 additions and 17 deletions

View File

@ -209,9 +209,9 @@ fn main() {
.map(|s| writeln!(outlock, "{}", s).to_exit_code().unwrap_or_exit()); .map(|s| writeln!(outlock, "{}", s).to_exit_code().unwrap_or_exit());
} }
viewer if let Err(e) = viewer.view_entry(&entry, &mut outlock) {
.view_entry(&entry, &mut outlock) handle_error(e);
.map_err_trace_exit_unwrap(); }
rt.report_touched(entry.get_location()).unwrap_or_exit(); 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()); .map(|s| writeln!(outlock, "{}", s).to_exit_code().unwrap_or_exit());
} }
viewer if let Err(e) = viewer.view_entry(&entry, &mut outlock) {
.view_entry(&entry, &mut outlock) handle_error(e);
.map_err_trace_exit_unwrap(); }
rt.report_touched(entry.get_location()).unwrap_or_exit(); 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) (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()
}
}

View File

@ -23,9 +23,11 @@ use libimagrt::runtime::Runtime;
use libimagerror::trace::MapErrTrace; use libimagerror::trace::MapErrTrace;
use libimagerror::iter::TraceIterator; use libimagerror::iter::TraceIterator;
use libimagerror::exit::ExitUnwrap; use libimagerror::exit::ExitUnwrap;
use libimagerror::io::ToExitCode;
use libimagutil::warn_exit::warn_exit; use libimagutil::warn_exit::warn_exit;
use libimagstore::iter::get::StoreIdGetIteratorExtension; use libimagstore::iter::get::StoreIdGetIteratorExtension;
use libimagentryview::viewer::Viewer; use libimagentryview::viewer::Viewer;
use libimagentryview::error::Error;
use crate::util::get_diary_name; use crate::util::get_diary_name;
@ -49,7 +51,13 @@ pub fn view(rt: &Runtime) {
}); });
let out = rt.stdout(); let out = rt.stdout();
DV::new(hdr).view_entries(entries, &mut out.lock()) let mut outlock = out.lock();
.map_err_trace_exit_unwrap();
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()
}
}
} }

View File

@ -22,14 +22,14 @@
use std::io::Write; use std::io::Write;
use std::ops::Deref; use std::ops::Deref;
use failure::Fallible as Result;
use failure::ResultExt; use failure::ResultExt;
use failure::err_msg; use failure::err_msg;
use failure::Error;
use libimagstore::store::Entry; use libimagstore::store::Entry;
use libimagentryview::viewer::Viewer; use libimagentryview::viewer::Viewer;
use libimagentryview::builtin::plain::PlainViewer; use libimagentryview::builtin::plain::PlainViewer;
use libimagentryview::error::Error;
use libimagentryview::error::Result;
use crate::entry::DiaryEntry; use crate::entry::DiaryEntry;
/// This viewer does _not_ implement libimagentryview::viewer::Viewer because we need to be able to /// This viewer does _not_ implement libimagentryview::viewer::Viewer because we need to be able to

View File

@ -24,9 +24,9 @@ use libimagrt::runtime::Runtime;
use libimagentryedit::edit::edit_in_tmpfile; use libimagentryedit::edit::edit_in_tmpfile;
use crate::viewer::Viewer; use crate::viewer::Viewer;
use failure::Fallible as Result; use crate::error::Result;
use crate::error::Error;
use failure::ResultExt; use failure::ResultExt;
use failure::Error;
pub struct EditorView<'a>(&'a Runtime<'a>); pub struct EditorView<'a>(&'a Runtime<'a>);

View File

@ -27,8 +27,8 @@ use pulldown_cmark::Parser;
use syntect::parsing::SyntaxSet; use syntect::parsing::SyntaxSet;
use crate::viewer::Viewer; use crate::viewer::Viewer;
use failure::Fallible as Result; use crate::error::Result;
use failure::Error; use crate::error::Error;
pub struct MarkdownViewer<'a> { pub struct MarkdownViewer<'a> {
rt: &'a Runtime<'a>, rt: &'a Runtime<'a>,
@ -66,6 +66,7 @@ impl<'a> Viewer for MarkdownViewer<'a> {
self.resource_access.clone(), self.resource_access.clone(),
syntax_set) syntax_set)
.map_err(|e| e.compat()) .map_err(|e| e.compat())
.map_err(::failure::Error::from)
.map_err(Error::from) .map_err(Error::from)
} }
} }

View File

@ -22,7 +22,7 @@ use std::io::Write;
use libimagstore::store::Entry; use libimagstore::store::Entry;
use crate::viewer::Viewer; use crate::viewer::Viewer;
use failure::Fallible as Result; use crate::error::Result;
pub struct PlainViewer { pub struct PlainViewer {
show_header: bool show_header: bool

View File

@ -24,7 +24,7 @@ use libimagstore::store::Entry;
use toml::ser::to_string; use toml::ser::to_string;
use crate::viewer::Viewer; use crate::viewer::Viewer;
use failure::Fallible as Result; use crate::error::Result;
pub struct StdoutViewer { pub struct StdoutViewer {
view_header: bool, view_header: bool,

View File

@ -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>;

View File

@ -56,5 +56,6 @@ extern crate libimagerror;
extern crate libimagentryedit; extern crate libimagentryedit;
pub mod builtin; pub mod builtin;
pub mod error;
pub mod viewer; pub mod viewer;

View File

@ -22,7 +22,7 @@ use std::ops::Deref;
use libimagstore::store::Entry; use libimagstore::store::Entry;
use failure::Fallible as Result; use crate::error::Result;
pub trait Viewer { pub trait Viewer {