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},
|
path::{Path, PathBuf},
|
||||||
};
|
};
|
||||||
|
|
||||||
use mail_parser::Message;
|
use mail_parser::Message as MpMessage;
|
||||||
|
|
||||||
use sanitize_html::{rules::Element, sanitize_str};
|
use sanitize_html::{rules::Element, sanitize_str};
|
||||||
use sha2::{Digest, Sha256};
|
use sha2::{Digest, Sha256};
|
||||||
|
@ -19,6 +19,28 @@ extern crate sha2;
|
||||||
|
|
||||||
use message_reader::{EmailReader, TestMessagesReader};
|
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() {
|
fn main() {
|
||||||
let dir = Path::new("data");
|
let dir = Path::new("data");
|
||||||
if !dir.exists() {
|
if !dir.exists() {
|
||||||
|
@ -27,10 +49,10 @@ fn main() {
|
||||||
|
|
||||||
let mut reader = TestMessagesReader::new((&Path::new("tests/data")).to_path_buf());
|
let mut reader = TestMessagesReader::new((&Path::new("tests/data")).to_path_buf());
|
||||||
|
|
||||||
for (uid, message) in reader.read_rfc822_messages() {
|
for msg in reader.read_rfc822_messages() {
|
||||||
println!("Processing message {}", &uid);
|
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");
|
let title = parsed.get_subject().expect("Expected a subject");
|
||||||
|
|
||||||
println!("{}", &title);
|
println!("{}", &title);
|
||||||
|
|
|
@ -10,8 +10,10 @@ use std::{
|
||||||
use imap::Session;
|
use imap::Session;
|
||||||
use rustls_connector::RustlsConnector;
|
use rustls_connector::RustlsConnector;
|
||||||
|
|
||||||
|
use crate::Message;
|
||||||
|
|
||||||
pub trait EmailReader {
|
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 {
|
pub(crate) struct TestMessagesReader {
|
||||||
|
@ -25,7 +27,7 @@ impl TestMessagesReader {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EmailReader for 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) {
|
let reader = match read_dir(&self.path) {
|
||||||
Ok(r) => r,
|
Ok(r) => r,
|
||||||
Err(_) => return Box::new(Vec::new().into_iter()),
|
Err(_) => return Box::new(Vec::new().into_iter()),
|
||||||
|
@ -47,9 +49,10 @@ impl EmailReader for TestMessagesReader {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.filter(|i| i.is_some())
|
.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)
|
Box::new(iter)
|
||||||
}
|
}
|
||||||
|
@ -129,17 +132,15 @@ impl ImapReader {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EmailReader for 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() {
|
let msgs = match self.connect() {
|
||||||
Ok(m) => m,
|
Ok(m) => m,
|
||||||
Err(_) => return Box::new(Vec::new().into_iter()),
|
Err(_) => return Box::new(Vec::new().into_iter()),
|
||||||
};
|
};
|
||||||
|
|
||||||
let items = msgs
|
let items = msgs.iter().map(|i| Message::new(i.0.to_owned(), i.1.to_owned()));
|
||||||
.iter()
|
|
||||||
.map(|i| (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)
|
Box::new(iter)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue