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:
Jacob Kiers 2022-07-20 23:03:23 +02:00
parent 13c8665daa
commit 02be91a75d
2 changed files with 36 additions and 13 deletions

View File

@ -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);

View File

@ -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)
}