newsletter-to-web/src/message_reader/data_directory.rs

62 lines
1.7 KiB
Rust

use std::{
fs::{read_dir, DirEntry},
path::PathBuf,
vec::IntoIter,
};
use crate::message::Message;
use crate::message_reader::EmailReader;
pub(crate) struct DataDirectoryMessageReader {
path: PathBuf,
}
impl DataDirectoryMessageReader {
pub fn new(path: PathBuf) -> Self {
DataDirectoryMessageReader { path }
}
}
impl EmailReader for DataDirectoryMessageReader {
fn read_rfc822_messages(&mut self) -> Box<IntoIter<Message>> {
println!("Reading files in {}", &self.path.display());
let reader = match read_dir(&self.path) {
Ok(r) => r,
Err(e) => {
dbg!(e);
return Box::new(Vec::new().into_iter());
}
};
let items = reader
.filter(|i| i.is_ok())
.map(|i| i.unwrap() as DirEntry)
.filter(|d| match d.path().extension() {
Some(ext) => ext == "eml",
None => false,
})
.filter_map(|i| {
let uid = i
.path()
.file_stem()
.unwrap()
.to_owned()
.into_string()
.expect("Could not convert filename to string.")
.split('_')
.collect::<Vec<&str>>()[0]
.trim_start_matches('0')
.to_string();
if let Ok(data) = std::fs::read(i.path()) {
Some((uid, data))
} else {
None
}
})
.map(|i| Message::new(i.0, i.1));
let iter = items.collect::<Vec<Message>>().into_iter();
Box::new(iter)
}
}