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