Merge pull request #1418 from matthiasbeyer/libimagentryview/pass-sink

Rewrite libimagentryview interface
This commit is contained in:
Matthias Beyer 2018-04-24 18:00:57 +02:00 committed by GitHub
commit f882f6eeaf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 78 additions and 29 deletions

View file

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

View file

@ -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" }

View file

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

View file

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

View file

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

View file

@ -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(())

View file

@ -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)
}

View file

@ -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(())
}

View file

@ -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())?,
}
}

View file

@ -22,6 +22,10 @@ error_chain! {
ViewError, ViewErrorKind, ResultExt, Result;
}
foreign_links {
IO(::std::io::Error);
}
links {
StoreError(::libimagstore::error::StoreError, ::libimagstore::error::StoreErrorKind);
}

View file

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