2023-05-25 23:35:24 -04:00
|
|
|
use crate::prelude::{Host, Mailbox};
|
2023-05-26 01:34:29 -04:00
|
|
|
use std::{fmt, str::FromStr};
|
2023-05-25 23:35:24 -04:00
|
|
|
|
|
|
|
#[cfg(feature = "serde")]
|
|
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
|
|
|
|
mod error;
|
|
|
|
pub use error::Error;
|
|
|
|
|
|
|
|
#[derive(Clone, Debug, PartialEq)]
|
|
|
|
pub struct Recipients {
|
|
|
|
pub boxes: Vec<Mailbox>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl fmt::Display for Recipients {
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
|
|
write!(f, ":")?;
|
2023-05-26 01:34:29 -04:00
|
|
|
self.boxes.iter().try_for_each(|b| write!(f, " {b}"))
|
2023-05-25 23:35:24 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug, PartialEq)]
|
|
|
|
pub enum Lines {
|
|
|
|
Sender(Mailbox),
|
|
|
|
Recipients(Recipients),
|
|
|
|
Timestamp(String),
|
|
|
|
Text(String),
|
|
|
|
Heading1(String),
|
|
|
|
Heading2(String),
|
|
|
|
Heading3(String),
|
|
|
|
Quote(String),
|
|
|
|
Preformatted(String),
|
|
|
|
}
|
|
|
|
|
|
|
|
impl fmt::Display for Lines {
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
|
|
match self {
|
|
|
|
Self::Sender(m) => writeln!(f, "< {m}"),
|
|
|
|
Self::Recipients(r) => writeln!(f, "{r}"),
|
|
|
|
Self::Timestamp(t) => writeln!(f, "@ {t}"),
|
|
|
|
Self::Text(t) => writeln!(f, "{t}"),
|
|
|
|
Self::Heading1(h) => writeln!(f, "# {h}"),
|
|
|
|
Self::Heading2(h) => writeln!(f, "## {h}"),
|
|
|
|
Self::Heading3(h) => writeln!(f, "### {h}"),
|
|
|
|
Self::Quote(q) => {
|
|
|
|
for l in q.lines() {
|
|
|
|
writeln!(f, "> {l}")?;
|
|
|
|
}
|
|
|
|
Ok(())
|
2023-05-26 01:34:29 -04:00
|
|
|
}
|
2023-05-25 23:35:24 -04:00
|
|
|
Self::Preformatted(p) => writeln!(f, "```\n{p}\n```"),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, PartialEq)]
|
|
|
|
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
|
|
|
|
pub struct Message {
|
2023-05-28 00:18:15 -04:00
|
|
|
pub id: String,
|
2023-05-25 23:35:24 -04:00
|
|
|
pub senders: Vec<Mailbox>,
|
|
|
|
pub recipients: Vec<Mailbox>,
|
|
|
|
pub timstamp: Option<String>,
|
2023-05-27 23:38:41 -04:00
|
|
|
pub title: Option<String>,
|
2023-05-25 23:35:24 -04:00
|
|
|
pub body: String,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl fmt::Display for Message {
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
|
|
if !self.senders.is_empty() {
|
|
|
|
write!(f, "< ")?;
|
2023-05-26 01:34:29 -04:00
|
|
|
self.senders.iter().try_for_each(|s| write!(f, "{s}\n"))?;
|
2023-05-25 23:35:24 -04:00
|
|
|
}
|
|
|
|
if !self.recipients.is_empty() {
|
|
|
|
write!(f, ": ")?;
|
2023-05-26 01:34:29 -04:00
|
|
|
self.recipients.iter().try_for_each(|r| write!(f, " {r}"))?;
|
2023-05-25 23:35:24 -04:00
|
|
|
write!(f, "\n")?;
|
|
|
|
}
|
|
|
|
write!(f, "{}\r\n", self.body)
|
|
|
|
}
|
|
|
|
}
|