From ba225549e3ca60fee55a6449055a02be1f4cd5b7 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Mon, 3 Aug 2020 18:20:03 +0200 Subject: Add viewing of all direct subparts Signed-off-by: Matthias Beyer --- src/mail_view.rs | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/mail_view.rs b/src/mail_view.rs index eb446ce..ce1d4b5 100644 --- a/src/mail_view.rs +++ b/src/mail_view.rs @@ -18,6 +18,7 @@ use cursive::views::ResizedView; use cursive::views::TextView; use cursive::views::LinearLayout; use cursive::views::ScrollView; +use result_inspect::ResultInspect; pub struct MailView { database_path: PathBuf, @@ -33,11 +34,25 @@ impl MailView { .search_messages()? .map(|msg| { debug!("Constructing textview for '{}'", msg.filename().display()); - MailView::path_to_textview(msg.filename()) + let buf = std::fs::read(msg.filename())?; + debug!("Found {} bytes from {}", buf.len(), msg.filename().display()); + + let parsed = mailparse::parse_mail(buf)?; + + let iter = std::iter::once(parsed.get_body().map(TextView::new)) + .chain({ + parsed.subparts + .into_iter() + .map(|chld| chld.get_body().map(TextView::new)) + }); + + Ok(iter) }) - .fold(Ok(LinearLayout::vertical()), |r, el| { - el.and_then(|e| { - r.map(|lv| lv.child(e)) + .fold(Ok(LinearLayout::vertical()), |ll: Result<_>, views: Result<_>| { + views?.fold(ll, |l, elem| { + l.and_then(|l| { + elem.map_err(Error::from).map(|e| l.child(e)) + }) }) })?; @@ -53,13 +68,11 @@ impl MailView { } fn path_to_textview(pb: PathBuf) -> Result { - let s = std::fs::read(&pb) + std::fs::read(&pb) .map_err(Error::from) - .and_then(|b| String::from_utf8(b).map_err(Error::from))?; - - debug!("Found {} bytes from {}", s.bytes().len(), pb.display()); - - Ok(TextView::new(s)) + .and_then(|b| String::from_utf8(b).map_err(Error::from)) + .inspect(|s| debug!("Found {} bytes from {}", s.bytes().len(), pb.display())) + .map(TextView::new) } } -- cgit v1.2.3