~matthiasbeyer/imag

f882f6eeafb4559d0b78a753561234a1c6e7a272 — Matthias Beyer 3 years ago 726e4c5 + 279f7ef
Merge pull request #1418 from matthiasbeyer/libimagentryview/pass-sink

Rewrite libimagentryview interface
M bin/core/imag-view/src/main.rs => bin/core/imag-view/src/main.rs +4 -1
@@ 185,6 185,9 @@ fn main() {
            viewer.wrap_at(width);
        }

        let output      = rt.stdout();
        let mut lockout = output.lock();

        entry_ids
            .into_iter()
            .into_get_iter(rt.store())


@@ 195,7 198,7 @@ fn main() {
                     .map_err_trace_exit_unwrap(1)
            })
            .for_each(|e| {
                viewer.view_entry(&e).map_err_trace_exit_unwrap(1);
                viewer.view_entry(&e, &mut lockout).map_err_trace_exit_unwrap(1);
            });
    }
}

M bin/domain/imag-diary/Cargo.toml => bin/domain/imag-diary/Cargo.toml +1 -0
@@ 33,6 33,7 @@ libimagstore       = { version = "0.8.0", path = "../../../lib/core/libimagstore
libimagrt          = { version = "0.8.0", path = "../../../lib/core/libimagrt" }
libimagdiary       = { version = "0.8.0", path = "../../../lib/domain/libimagdiary" }
libimagentryedit   = { version = "0.8.0", path = "../../../lib/entry/libimagentryedit" }
libimagentryview   = { version = "0.8.0", path = "../../../lib/entry/libimagentryview" }
libimaginteraction = { version = "0.8.0", path = "../../../lib/etc/libimaginteraction" }
libimagutil        = { version = "0.8.0", path = "../../../lib/etc/libimagutil" }
libimagtimeui      = { version = "0.8.0", path = "../../../lib/etc/libimagtimeui" }

M bin/domain/imag-diary/src/main.rs => bin/domain/imag-diary/src/main.rs +1 -0
@@ 41,6 41,7 @@ extern crate itertools;

extern crate libimagdiary;
extern crate libimagentryedit;
extern crate libimagentryview;
extern crate libimagerror;
extern crate libimaginteraction;
#[macro_use] extern crate libimagrt;

M bin/domain/imag-diary/src/view.rs => bin/domain/imag-diary/src/view.rs +3 -1
@@ 23,6 23,7 @@ use libimagrt::runtime::Runtime;
use libimagerror::trace::MapErrTrace;
use libimagutil::warn_exit::warn_exit;
use libimagstore::iter::get::StoreIdGetIteratorExtension;
use libimagentryview::viewer::Viewer;

use util::get_diary_name;



@@ 39,7 40,8 @@ pub fn view(rt: &Runtime) {
            ::std::process::exit(1)
        }));

    DV::new(hdr).view_entries(entries)
    let out = rt.stdout();
    DV::new(hdr).view_entries(entries, &mut out.lock())
        .map_err_trace_exit_unwrap(1);
}


M lib/domain/libimagdiary/src/error.rs => lib/domain/libimagdiary/src/error.rs +4 -0
@@ 22,6 22,10 @@ error_chain! {
        DiaryError, DiaryErrorKind, ResultExt, Result;
    }

    foreign_links {
        Io(::std::io::Error);
    }

    links {
        StoreError(::libimagstore::error::StoreError, ::libimagstore::error::StoreErrorKind);
        EntryUtilError(::libimagentryutil::error::EntryUtilError, ::libimagentryutil::error::EntryUtilErrorKind);

M lib/domain/libimagdiary/src/viewer.rs => lib/domain/libimagdiary/src/viewer.rs +27 -14
@@ 19,14 19,16 @@

//! A diary viewer built on libimagentryview.

use entry::DiaryEntry;
use error::DiaryErrorKind as DEK;
use error::ResultExt;
use error::Result;
use std::io::Write;
use std::ops::Deref;

use libimagstore::store::FileLockEntry;
use libimagstore::store::Entry;
use libimagentryview::viewer::Viewer;
use libimagentryview::error::ViewErrorKind as VEK;
use libimagentryview::error::ResultExt;
use libimagentryview::error::Result as ViewResult;
use libimagentryview::builtin::plain::PlainViewer;
use entry::DiaryEntry;

/// This viewer does _not_ implement libimagentryview::viewer::Viewer because we need to be able to
/// call some diary-type specific functions on the entries passed to this.


@@ 45,24 47,35 @@ impl DiaryViewer {
        DiaryViewer(PlainViewer::new(show_header))
    }

}

impl Viewer for DiaryViewer {

    fn view_entry<W>(&self, e: &Entry, sink: &mut W) -> ViewResult<()>
        where W: Write
    {
        self.0.view_entry(e, sink)
    }

    /// View all entries from the iterator, or stop immediately if an error occurs, returning that
    /// error.
    pub fn view_entries<'a, I: Iterator<Item = FileLockEntry<'a>>>(&self, entries: I) -> Result<()> {
    fn view_entries<I, E, W>(&self, entries: I, sink: &mut W) -> ViewResult<()>
        where I: Iterator<Item = E>,
              E: Deref<Target = Entry>,
              W: Write
    {
        let mut entries = entries
            .map(|e| e.diary_id().map(|id| (id, e)))
            .collect::<Result<Vec<_>>>()?;
            .map(|e| e.deref().diary_id().map(|id| (id, e)).chain_err(|| VEK::ViewError))
            .collect::<ViewResult<Vec<_>>>()?;

        entries.sort_by_key(|&(ref id, _)| {
            [id.year() as u32, id.month(), id.day(), id.hour(), id.minute(), id.second()]
        });

        for (id, entry) in entries.into_iter() {
            println!("{} :\n", id);
            let _ = self.0
                         .view_entry(&entry)
                         .chain_err(|| DEK::ViewError)
                         .chain_err(|| DEK::IOError)?;
            println!("\n---\n");
            writeln!(sink, "{} :\n", id)?;
            let _ = self.0.view_entry(entry.deref(), sink)?;
            writeln!(sink, "\n---\n")?;
        }

        Ok(())

M lib/entry/libimagentryview/src/builtin/editor.rs => lib/entry/libimagentryview/src/builtin/editor.rs +5 -1
@@ 17,6 17,8 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
//

use std::io::Write;

use libimagstore::store::Entry;
use libimagrt::runtime::Runtime;
use libimagentryedit::edit::edit_in_tmpfile;


@@ 35,7 37,9 @@ impl<'a> EditorView<'a> {
}

impl<'a> Viewer for EditorView<'a> {
    fn view_entry(&self, e: &Entry) -> Result<()> {
    fn view_entry<W>(&self, e: &Entry, _sink: &mut W) -> Result<()>
        where W: Write
    {
        let mut entry = e.to_str()?.clone().to_string();
        edit_in_tmpfile(self.0, &mut entry).chain_err(|| VEK::ViewError)
    }

M lib/entry/libimagentryview/src/builtin/plain.rs => lib/entry/libimagentryview/src/builtin/plain.rs +7 -3
@@ 17,6 17,8 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
//

use std::io::Write;

use libimagstore::store::Entry;

use viewer::Viewer;


@@ 38,11 40,13 @@ impl PlainViewer {

impl Viewer for PlainViewer {

    fn view_entry(&self, e: &Entry) -> Result<()> {
    fn view_entry<W>(&self, e: &Entry, sink: &mut W) -> Result<()>
        where W: Write
    {
        if self.show_header {
            println!("{}", e.get_header());
            let _ = writeln!(sink, "{}", e.get_header())?;
        }
        println!("{}", e.get_content());
        let _ = writeln!(sink, "{}", e.get_content())?;
        Ok(())
    }


M lib/entry/libimagentryview/src/builtin/stdout.rs => lib/entry/libimagentryview/src/builtin/stdout.rs +11 -6
@@ 17,6 17,8 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
//

use std::io::Write;

use libimagstore::store::Entry;

use toml::ser::to_string;


@@ 48,17 50,20 @@ impl StdoutViewer {

impl Viewer for StdoutViewer {

    fn view_entry(&self, e: &Entry) -> Result<()> {
    fn view_entry<W>(&self, e: &Entry, sink: &mut W) -> Result<()>
        where W: Write
    {
        if self.view_header {
            println!("{}", to_string(e.get_header()).unwrap_or(String::from("TOML Parser error")));
            let header = to_string(e.get_header()).unwrap_or(String::from("TOML Parser error"));
            let _ = writeln!(sink, "{}", header)?;
        }

        if self.view_content {
            match self.wrap_content {
                Some(limit) => ::textwrap::wrap(e.get_content(), limit).iter().for_each(|line| {
                    println!("{}", line)
                }),
                None => println!("{}", e.get_content()),
                Some(limit) => for line in ::textwrap::wrap(e.get_content(), limit).iter() {
                    let _ = writeln!(sink, "{}", line)?;
                },
                None => writeln!(sink, "{}", e.get_content())?,
            }
        }


M lib/entry/libimagentryview/src/error.rs => lib/entry/libimagentryview/src/error.rs +4 -0
@@ 22,6 22,10 @@ error_chain! {
        ViewError, ViewErrorKind, ResultExt, Result;
    }

    foreign_links {
        IO(::std::io::Error);
    }

    links {
        StoreError(::libimagstore::error::StoreError, ::libimagstore::error::StoreErrorKind);
    }

M lib/entry/libimagentryview/src/viewer.rs => lib/entry/libimagentryview/src/viewer.rs +11 -3
@@ 17,17 17,25 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
//

use std::io::Write;
use std::ops::Deref;

use libimagstore::store::Entry;

use error::Result;

pub trait Viewer {

    fn view_entry(&self, e: &Entry) -> Result<()>;
    fn view_entry<W>(&self, e: &Entry, sink: &mut W) -> Result<()>
        where W: Write;

    fn view_entries<I: Iterator<Item = Entry>>(&self, entries: I) -> Result<()> {
    fn view_entries<I, E, W>(&self, entries: I, sink: &mut W) -> Result<()>
        where I: Iterator<Item = E>,
              E: Deref<Target = Entry>,
              W: Write
    {
        for entry in entries {
            if let Err(e) = self.view_entry(&entry) {
            if let Err(e) = self.view_entry(entry.deref(), sink) {
                return Err(e);
            }
        }