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