use std::io::Write;
use std::ops::Deref;
use failure::ResultExt;
use failure::err_msg;
use libimagstore::store::Entry;
use libimagentryview::viewer::Viewer;
use libimagentryview::builtin::plain::PlainViewer;
use libimagentryview::error::Error;
use libimagentryview::error::Result;
use crate::entry::DiaryEntry;
pub struct DiaryViewer(PlainViewer);
impl DiaryViewer {
pub fn new(show_header: bool) -> DiaryViewer {
DiaryViewer(PlainViewer::new(show_header))
}
}
impl Viewer for DiaryViewer {
fn view_entry<W>(&self, e: &Entry, sink: &mut W) -> Result<()>
where W: Write
{
self.0.view_entry(e, sink)
}
fn view_entries<I, E, W>(&self, entries: I, sink: &mut W) -> Result<()>
where I: Iterator<Item = E>,
E: Deref<Target = Entry>,
W: Write
{
let mut entries = entries
.map(|e| {
e.deref()
.diary_id()
.map(|id| (id, e))
.context(err_msg("View error"))
.map_err(Error::from)
})
.collect::<Result<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() {
writeln!(sink, "{} :\n", id)?;
self.0.view_entry(entry.deref(), sink)?;
writeln!(sink, "\n---\n")?;
}
Ok(())
}
}