summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2020-08-03 18:48:48 +0200
committerMatthias Beyer <mail@beyermatthias.de>2020-08-03 18:49:41 +0200
commit6acfb19f9d6f74044e3df868fd470f172bb67133 (patch)
tree91df735d4c85afbec8f8475573b6dc23d89bde63
parentba225549e3ca60fee55a6449055a02be1f4cd5b7 (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.rs35
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)