summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2020-07-05 12:13:32 +0200
committerMatthias Beyer <mail@beyermatthias.de>2020-07-05 12:13:40 +0200
commit44ebbe5193aa16b38e55791fd37adf6d8032dc85 (patch)
tree3c0ac0a6800b5e0cb2406f9fd92b3d667acf2a93 /src
parent16830319e27318f5f69e3f4b1c734d541bcf3037 (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.rs54
-rw-r--r--src/main.rs34
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);