~matthiasbeyer/imag

a2433f315d130a2c130010669828b5a49d083b01 — Matthias Beyer 2 years ago cee7689 + bb4f0ac
Merge branch 'libimagentryview-propagate-io-errors' into master
M bin/core/imag-view/src/main.rs => bin/core/imag-view/src/main.rs +14 -6
@@ 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()
    }
}


M bin/domain/imag-diary/src/view.rs => bin/domain/imag-diary/src/view.rs +10 -2
@@ 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()
        }
    }
}


M lib/domain/libimagdiary/src/viewer.rs => lib/domain/libimagdiary/src/viewer.rs +2 -2
@@ 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

M lib/entry/libimagentryview/src/builtin/editor.rs => lib/entry/libimagentryview/src/builtin/editor.rs +2 -2
@@ 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>);


M lib/entry/libimagentryview/src/builtin/md.rs => lib/entry/libimagentryview/src/builtin/md.rs +3 -2
@@ 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)
    }
}

M lib/entry/libimagentryview/src/builtin/plain.rs => lib/entry/libimagentryview/src/builtin/plain.rs +1 -1
@@ 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

M lib/entry/libimagentryview/src/builtin/stdout.rs => lib/entry/libimagentryview/src/builtin/stdout.rs +1 -1
@@ 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,

A lib/entry/libimagentryview/src/error.rs => lib/entry/libimagentryview/src/error.rs +66 -0
@@ 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>;


M lib/entry/libimagentryview/src/lib.rs => lib/entry/libimagentryview/src/lib.rs +1 -0
@@ 56,5 56,6 @@ extern crate libimagerror;
extern crate libimagentryedit;

pub mod builtin;
pub mod error;
pub mod viewer;


M lib/entry/libimagentryview/src/viewer.rs => lib/entry/libimagentryview/src/viewer.rs +1 -1
@@ 22,7 22,7 @@ use std::ops::Deref;

use libimagstore::store::Entry;

use failure::Fallible as Result;
use crate::error::Result;

pub trait Viewer {