From 780dd90c8fc98345a700a5da691e2c30719e2af6 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Wed, 18 Apr 2018 14:47:06 +0200 Subject: [PATCH 1/4] Rewrite libimagentryview interface In the previous versions, the sink (where the entries should be written to) was not passed. This did conflict with the libimagrt holding the stdout/stderr handles, because it automatically writes to stdout (which we don't want to do in some cases). Passing the sink is way nicer. This patch changes libimagentryview so that the sink is passed to the viewer. --- .../libimagentryview/src/builtin/editor.rs | 6 +++++- lib/entry/libimagentryview/src/builtin/plain.rs | 10 +++++++--- .../libimagentryview/src/builtin/stdout.rs | 17 +++++++++++------ lib/entry/libimagentryview/src/error.rs | 4 ++++ lib/entry/libimagentryview/src/viewer.rs | 14 +++++++++++--- 5 files changed, 38 insertions(+), 13 deletions(-) diff --git a/lib/entry/libimagentryview/src/builtin/editor.rs b/lib/entry/libimagentryview/src/builtin/editor.rs index 25d2992b..c5cd7394 100644 --- a/lib/entry/libimagentryview/src/builtin/editor.rs +++ b/lib/entry/libimagentryview/src/builtin/editor.rs @@ -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(&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) } diff --git a/lib/entry/libimagentryview/src/builtin/plain.rs b/lib/entry/libimagentryview/src/builtin/plain.rs index 3c170a87..b276ed93 100644 --- a/lib/entry/libimagentryview/src/builtin/plain.rs +++ b/lib/entry/libimagentryview/src/builtin/plain.rs @@ -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(&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(()) } diff --git a/lib/entry/libimagentryview/src/builtin/stdout.rs b/lib/entry/libimagentryview/src/builtin/stdout.rs index 5a270745..f74f6b14 100644 --- a/lib/entry/libimagentryview/src/builtin/stdout.rs +++ b/lib/entry/libimagentryview/src/builtin/stdout.rs @@ -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(&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())?, } } diff --git a/lib/entry/libimagentryview/src/error.rs b/lib/entry/libimagentryview/src/error.rs index 7c313f76..e910fd87 100644 --- a/lib/entry/libimagentryview/src/error.rs +++ b/lib/entry/libimagentryview/src/error.rs @@ -22,6 +22,10 @@ error_chain! { ViewError, ViewErrorKind, ResultExt, Result; } + foreign_links { + IO(::std::io::Error); + } + links { StoreError(::libimagstore::error::StoreError, ::libimagstore::error::StoreErrorKind); } diff --git a/lib/entry/libimagentryview/src/viewer.rs b/lib/entry/libimagentryview/src/viewer.rs index a6997f0f..dc0194cd 100644 --- a/lib/entry/libimagentryview/src/viewer.rs +++ b/lib/entry/libimagentryview/src/viewer.rs @@ -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(&self, e: &Entry, sink: &mut W) -> Result<()> + where W: Write; - fn view_entries>(&self, entries: I) -> Result<()> { + fn view_entries(&self, entries: I, sink: &mut W) -> Result<()> + where I: Iterator, + E: Deref, + 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); } } From 55d9b5456fdae9a248577c50e51b7d0d14261ff8 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Thu, 19 Apr 2018 22:45:44 +0200 Subject: [PATCH 2/4] Adapt to new libimagentryview interface And properly implement Viewer for DiaryViewer --- lib/domain/libimagdiary/src/error.rs | 4 +++ lib/domain/libimagdiary/src/viewer.rs | 41 ++++++++++++++++++--------- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/lib/domain/libimagdiary/src/error.rs b/lib/domain/libimagdiary/src/error.rs index 4bb9a3f6..8af017b5 100644 --- a/lib/domain/libimagdiary/src/error.rs +++ b/lib/domain/libimagdiary/src/error.rs @@ -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); diff --git a/lib/domain/libimagdiary/src/viewer.rs b/lib/domain/libimagdiary/src/viewer.rs index 17971f5f..752f3180 100644 --- a/lib/domain/libimagdiary/src/viewer.rs +++ b/lib/domain/libimagdiary/src/viewer.rs @@ -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(&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>>(&self, entries: I) -> Result<()> { + fn view_entries(&self, entries: I, sink: &mut W) -> ViewResult<()> + where I: Iterator, + E: Deref, + W: Write + { let mut entries = entries - .map(|e| e.diary_id().map(|id| (id, e))) - .collect::>>()?; + .map(|e| e.deref().diary_id().map(|id| (id, e)).chain_err(|| VEK::ViewError)) + .collect::>>()?; 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(()) From 653db333e66f0eeccd6b18323ff4eb1d7e83d507 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Mon, 23 Apr 2018 14:23:17 +0200 Subject: [PATCH 3/4] Fix imag-view for new view_entry() interface --- bin/core/imag-view/src/main.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/bin/core/imag-view/src/main.rs b/bin/core/imag-view/src/main.rs index 15d5bbf3..67fc6a07 100644 --- a/bin/core/imag-view/src/main.rs +++ b/bin/core/imag-view/src/main.rs @@ -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); }); } } From 279f7ef2aaeed23bc0ac126504ece88e0f063a49 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Tue, 24 Apr 2018 15:43:11 +0200 Subject: [PATCH 4/4] Fix: Pass output stream to view_entries() --- bin/domain/imag-diary/Cargo.toml | 1 + bin/domain/imag-diary/src/main.rs | 1 + bin/domain/imag-diary/src/view.rs | 4 +++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/bin/domain/imag-diary/Cargo.toml b/bin/domain/imag-diary/Cargo.toml index 91ae9608..7b8f2cf0 100644 --- a/bin/domain/imag-diary/Cargo.toml +++ b/bin/domain/imag-diary/Cargo.toml @@ -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" } diff --git a/bin/domain/imag-diary/src/main.rs b/bin/domain/imag-diary/src/main.rs index 6fa7fb62..ebf343d9 100644 --- a/bin/domain/imag-diary/src/main.rs +++ b/bin/domain/imag-diary/src/main.rs @@ -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; diff --git a/bin/domain/imag-diary/src/view.rs b/bin/domain/imag-diary/src/view.rs index 66a952c0..7e48fd90 100644 --- a/bin/domain/imag-diary/src/view.rs +++ b/bin/domain/imag-diary/src/view.rs @@ -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); }