diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2020-08-03 18:48:48 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2020-08-03 18:49:41 +0200 |
commit | 6acfb19f9d6f74044e3df868fd470f172bb67133 (patch) | |
tree | 91df735d4c85afbec8f8475573b6dc23d89bde63 | |
parent | ba225549e3ca60fee55a6449055a02be1f4cd5b7 (diff) |
Simplify implementation for making list of views for parsed email
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r-- | src/mail_view.rs | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/src/mail_view.rs b/src/mail_view.rs index ce1d4b5..f9e7825 100644 --- a/src/mail_view.rs +++ b/src/mail_view.rs @@ -19,6 +19,7 @@ use cursive::views::TextView; use cursive::views::LinearLayout; use cursive::views::ScrollView; use result_inspect::ResultInspect; +use mailparse::ParsedMail; pub struct MailView { database_path: PathBuf, @@ -38,21 +39,12 @@ impl MailView { 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) + MailView::parsed_mail_to_list_of_textviews(&parsed) }) - .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)) - }) + .fold(Ok(LinearLayout::vertical()), |ll: Result<_>, views: Result<Vec<TextView>>| { + ll.and_then(|mut l| { + views?.into_iter().for_each(|e| l.add_child(e)); + Ok(l) }) })?; @@ -67,6 +59,21 @@ impl MailView { Ok(MailView { database_path, view: view.scrollable() }.with_name(name)) } + fn parsed_mail_to_list_of_textviews<'a>(pm: &'a ParsedMail) -> Result<Vec<TextView>> { + fn collect_into<'a>(v: &mut Vec<TextView>, pm: &'a ParsedMail) -> Result<()> { + v.push(pm.get_body().map(TextView::new)?); + + pm.subparts + .iter() + .map(|subp| collect_into(v, subp)) + .collect::<Result<Vec<_>>>() + .map(|_| ()) + } + + let mut vec = Vec::new(); + collect_into(&mut vec, pm).map(|_| vec) + } + fn path_to_textview(pb: PathBuf) -> Result<TextView> { std::fs::read(&pb) .map_err(Error::from) |