Add struct Message, owning the data
This is more understandable than using (String, Vec<u8>) everywhere. Signed-off-by: Jacob Kiers <jacob@jacobkiers.net>
This commit is contained in:
parent
13c8665daa
commit
02be91a75d
|
@ -6,7 +6,7 @@ use std::{
|
|||
path::{Path, PathBuf},
|
||||
};
|
||||
|
||||
use mail_parser::Message;
|
||||
use mail_parser::Message as MpMessage;
|
||||
|
||||
use sanitize_html::{rules::Element, sanitize_str};
|
||||
use sha2::{Digest, Sha256};
|
||||
|
@ -19,6 +19,28 @@ extern crate sha2;
|
|||
|
||||
use message_reader::{EmailReader, TestMessagesReader};
|
||||
|
||||
pub struct Message {
|
||||
uid: String,
|
||||
data: Vec<u8>,
|
||||
}
|
||||
|
||||
impl Message {
|
||||
pub fn new(uid: String, data: Vec<u8>) -> Message {
|
||||
Message {
|
||||
uid,
|
||||
data,
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn get_parsed(&self) -> Option<MpMessage> {
|
||||
MpMessage::parse(&self.data)
|
||||
}
|
||||
|
||||
pub fn get_uid(&self) -> &String {
|
||||
&self.uid
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let dir = Path::new("data");
|
||||
if !dir.exists() {
|
||||
|
@ -27,10 +49,10 @@ fn main() {
|
|||
|
||||
let mut reader = TestMessagesReader::new((&Path::new("tests/data")).to_path_buf());
|
||||
|
||||
for (uid, message) in reader.read_rfc822_messages() {
|
||||
println!("Processing message {}", &uid);
|
||||
for msg in reader.read_rfc822_messages() {
|
||||
println!("Processing message {}", msg.get_uid());
|
||||
|
||||
let parsed = Message::parse(&message).expect("A parsed messsage.");
|
||||
let parsed = msg.get_parsed().expect("A parsed messsage.");
|
||||
let title = parsed.get_subject().expect("Expected a subject");
|
||||
|
||||
println!("{}", &title);
|
||||
|
|
|
@ -10,8 +10,10 @@ use std::{
|
|||
use imap::Session;
|
||||
use rustls_connector::RustlsConnector;
|
||||
|
||||
use crate::Message;
|
||||
|
||||
pub trait EmailReader {
|
||||
fn read_rfc822_messages(&mut self) -> Box<IntoIter<(String, Vec<u8>)>>;
|
||||
fn read_rfc822_messages(&mut self) -> Box<IntoIter<Message>>;
|
||||
}
|
||||
|
||||
pub(crate) struct TestMessagesReader {
|
||||
|
@ -25,7 +27,7 @@ impl TestMessagesReader {
|
|||
}
|
||||
|
||||
impl EmailReader for TestMessagesReader {
|
||||
fn read_rfc822_messages(&mut self) -> Box<IntoIter<(String, Vec<u8>)>> {
|
||||
fn read_rfc822_messages(&mut self) -> Box<IntoIter<Message>> {
|
||||
let reader = match read_dir(&self.path) {
|
||||
Ok(r) => r,
|
||||
Err(_) => return Box::new(Vec::new().into_iter()),
|
||||
|
@ -47,9 +49,10 @@ impl EmailReader for TestMessagesReader {
|
|||
}
|
||||
})
|
||||
.filter(|i| i.is_some())
|
||||
.map(|i| i.unwrap());
|
||||
.map(|i| i.unwrap())
|
||||
.map(|i| Message::new(i.0, i.1));
|
||||
|
||||
let iter = items.collect::<Vec<(String, Vec<u8>)>>().into_iter();
|
||||
let iter = items.collect::<Vec<Message>>().into_iter();
|
||||
|
||||
Box::new(iter)
|
||||
}
|
||||
|
@ -129,17 +132,15 @@ impl ImapReader {
|
|||
}
|
||||
|
||||
impl EmailReader for ImapReader {
|
||||
fn read_rfc822_messages(&mut self) -> Box<IntoIter<(String, Vec<u8>)>> {
|
||||
fn read_rfc822_messages(&mut self) -> Box<IntoIter<Message>> {
|
||||
let msgs = match self.connect() {
|
||||
Ok(m) => m,
|
||||
Err(_) => return Box::new(Vec::new().into_iter()),
|
||||
};
|
||||
|
||||
let items = msgs
|
||||
.iter()
|
||||
.map(|i| (i.0.to_owned(), i.1.to_owned()));
|
||||
let items = msgs.iter().map(|i| Message::new(i.0.to_owned(), i.1.to_owned()));
|
||||
|
||||
let iter = items.collect::<Vec<(String, Vec<u8>)>>().into_iter();
|
||||
let iter = items.collect::<Vec<Message>>().into_iter();
|
||||
|
||||
Box::new(iter)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue