62 lines
1.7 KiB
Rust
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)
|
|
}
|
|
} |