diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2020-07-05 12:13:32 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2020-07-05 12:13:40 +0200 |
commit | 44ebbe5193aa16b38e55791fd37adf6d8032dc85 (patch) | |
tree | 3c0ac0a6800b5e0cb2406f9fd92b3d667acf2a93 /src | |
parent | 16830319e27318f5f69e3f4b1c734d541bcf3037 (diff) |
Rewrite to use own forks of maildir and mailparse
Implement mailstore module for holding parsed mail.
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'src')
-rw-r--r-- | src/mailstore.rs | 54 | ||||
-rw-r--r-- | src/main.rs | 34 |
2 files changed, 69 insertions, 19 deletions
diff --git a/src/mailstore.rs b/src/mailstore.rs new file mode 100644 index 0000000..3f1d299 --- /dev/null +++ b/src/mailstore.rs @@ -0,0 +1,54 @@ +use std::path::PathBuf; +use anyhow::Error; +use anyhow::Result; +use maildir::Maildir; +use maildir::MailEntry; +use mailparse::ParsedMail; + +pub struct MailStore { + dir: Maildir, + new: Vec<Mail>, + cur: Vec<Mail>, +} + +impl MailStore { + pub fn from_path(path: PathBuf) -> Self { + MailStore { + dir: Maildir::from(path), + new: vec![], + cur: vec![], + } + } + + pub fn load(&mut self) -> Result<()> { + self.cur = self.dir.list_cur().map(|m| Mail::from(m?)).collect::<Result<Vec<Mail>>>()?; + self.new = self.dir.list_new().map(|m| Mail::from(m?)).collect::<Result<Vec<Mail>>>()?; + Ok(()) + } + + pub fn new_mail(&self) -> &Vec<Mail> { + &self.new + } + + pub fn cur_mail(&self) -> &Vec<Mail> { + &self.cur + } +} + +pub struct Mail { + entry: MailEntry, + parsed: ParsedMail, +} + +impl Mail { + pub fn from(mut entry: MailEntry) -> Result<Self> { + Ok(Mail { + parsed: entry.parsed()?, + entry, + }) + } + + pub fn parsed(&self) -> &ParsedMail { + &self.parsed + } +} diff --git a/src/main.rs b/src/main.rs index 3a5fe79..358318f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,17 +1,19 @@ #[macro_use] extern crate anyhow; -use anyhow::Error; +use std::path::PathBuf; use anyhow::Result; use cursive::CursiveExt; use mailparse::MailHeaderMap; +use mailparse::ParsedMail; -fn list_view_for<I>(i: I) -> Result<cursive::views::ListView> - where I: IntoIterator<Item = Result<mailparse::ParsedMail>> +mod mailstore; + +fn list_view_for<'a, I>(i: I) -> Result<cursive::views::ListView> + where I: Iterator<Item = &'a ParsedMail> { let mut lv = cursive::views::ListView::new(); for elem in i { - let elem = elem?; let s = format!("{}: {} -> {} | {}", elem.headers.get_first_value("Date").unwrap_or_else(|| String::from("No date")), elem.headers.get_first_value("From").unwrap_or_else(|| String::from("No From")), @@ -25,21 +27,15 @@ fn list_view_for<I>(i: I) -> Result<cursive::views::ListView> } fn main() -> Result<()> { - let maildir_path = std::env::args().skip(1).next().ok_or_else(|| anyhow!("No path to maildir passed"))?; - - let md = maildir::Maildir::from(maildir_path); - let iter = md.list_cur() - .map(|r| { - r.map_err(Error::from) - .and_then(|r| { - println!("Reading: {}", r.path().display()); - std::fs::read_to_string(r.path()).map_err(Error::from) - }) - .and_then(|buf| { - mailparse::parse_mail(buf.into_bytes()).map_err(Error::from) - }) - }); - let view = list_view_for(iter)?; + let maildir_path = std::env::args() + .skip(1) + .next() + .map(PathBuf::from) + .ok_or_else(|| anyhow!("No path to maildir passed"))?; + + let mut md = mailstore::MailStore::from_path(maildir_path); + md.load()?; + let view = list_view_for(md.cur_mail().iter().map(mailstore::Mail::parsed))?; let mut siv = cursive::Cursive::default(); siv.add_layer(view); |