eml-codec/src/model.rs

144 lines
3.5 KiB
Rust
Raw Normal View History

2023-06-08 19:43:32 +00:00
use std::collections::HashMap;
2023-06-12 09:54:15 +00:00
use chrono::{DateTime,FixedOffset,ParseError};
2023-06-13 07:00:40 +00:00
#[derive(Debug, PartialEq)]
pub struct AddrSpec {
pub local_part: String,
pub domain: String,
}
impl AddrSpec {
pub fn fully_qualified(&self) -> String {
format!("{}@{}", self.local_part, self.domain)
}
}
2023-06-13 07:18:36 +00:00
#[derive(Debug, PartialEq)]
2023-06-13 07:00:40 +00:00
pub struct MailboxRef {
2023-06-12 14:05:06 +00:00
// The actual "email address" like hello@example.com
2023-06-13 07:00:40 +00:00
pub addrspec: AddrSpec,
pub name: Option<String>,
}
impl From<AddrSpec> for MailboxRef {
fn from(addr: AddrSpec) -> Self {
MailboxRef {
name: None,
addrspec: addr,
}
}
2023-06-12 14:05:06 +00:00
}
2023-06-13 11:21:00 +00:00
#[derive(Debug, PartialEq)]
2023-06-13 07:00:40 +00:00
pub struct GroupRef {
pub name: String,
2023-06-13 10:25:00 +00:00
pub participants: Vec<MailboxRef>,
2023-06-12 14:05:06 +00:00
}
2023-06-13 11:21:00 +00:00
#[derive(Debug, PartialEq)]
2023-06-13 07:00:40 +00:00
pub enum AddressRef {
Single(MailboxRef),
Many(GroupRef),
2023-06-12 14:05:06 +00:00
}
2023-06-13 10:25:00 +00:00
impl From<MailboxRef> for AddressRef {
fn from(mx: MailboxRef) -> Self {
AddressRef::Single(mx)
}
}
impl From<GroupRef> for AddressRef {
fn from(grp: GroupRef) -> Self {
AddressRef::Many(grp)
}
}
2023-06-12 14:05:06 +00:00
2023-06-13 13:12:16 +00:00
#[derive(Debug, PartialEq)]
pub struct MessageId<'a> {
pub left: &'a str,
pub right: &'a str,
}
2023-06-16 15:24:51 +00:00
#[derive(Debug, PartialEq)]
pub enum FieldBody<'a, T> {
Correct(T),
Failed(&'a str),
}
#[derive(Debug, PartialEq)]
pub enum Field<'a> {
// 3.6.1. The Origination Date Field
Date(FieldBody<'a, DateTime<FixedOffset>>),
// 3.6.2. Originator Fields
From(FieldBody<'a, Vec<MailboxRef>>),
Sender(FieldBody<'a, MailboxRef>),
ReplyTo(FieldBody<'a, Vec<AddressRef>>),
// 3.6.3. Destination Address Fields
To(FieldBody<'a, Vec<AddressRef>>),
Cc(FieldBody<'a, Vec<AddressRef>>),
Bcc(FieldBody<'a, Vec<AddressRef>>),
// 3.6.4. Identification Fields
MessageID(FieldBody<'a, MessageId<'a>>),
InReplyTo(FieldBody<'a, Vec<MessageId<'a>>>),
References(FieldBody<'a, Vec<MessageId<'a>>>),
// 3.6.5. Informational Fields
Subject(FieldBody<'a, String>),
Comments(FieldBody<'a, String>),
Keywords(FieldBody<'a, Vec<String>>),
// 3.6.6 Resent Fields (not implemented)
// 3.6.7 Trace Fields
Received(FieldBody<'a, &'a str>),
ReturnPath(FieldBody<'a, Option<MailboxRef>>),
// 3.6.8. Optional Fields
Optional(&'a str, String),
// None
Rescue(&'a str),
}
2023-06-12 14:05:06 +00:00
/// Permissive Header Section
///
/// This is a structure intended for parsing/decoding,
/// hence it's support cases where the email is considered
/// as invalid according to RFC5322 but for which we can
/// still extract some data.
2023-06-16 13:04:04 +00:00
#[derive(Debug, PartialEq, Default)]
2023-06-16 07:58:07 +00:00
pub struct HeaderSection<'a> {
2023-06-13 12:44:41 +00:00
// 3.6.1. The Origination Date Field
2023-06-16 15:24:51 +00:00
pub date: Option<DateTime<FixedOffset>>,
2023-06-13 12:44:41 +00:00
// 3.6.2. Originator Fields
2023-06-13 07:00:40 +00:00
pub from: Vec<MailboxRef>,
pub sender: Option<MailboxRef>,
pub reply_to: Vec<AddressRef>,
2023-06-13 12:44:41 +00:00
// 3.6.3. Destination Address Fields
pub to: Vec<AddressRef>,
pub cc: Vec<AddressRef>,
pub bcc: Vec<AddressRef>,
2023-06-13 13:43:14 +00:00
// 3.6.4. Identification Fields
pub msg_id: Option<MessageId<'a>>,
pub in_reply_to: Vec<MessageId<'a>>,
pub references: Vec<MessageId<'a>>,
2023-06-13 14:22:04 +00:00
// 3.6.5. Informational Fields
pub subject: Option<String>,
pub comments: Vec<String>,
pub keywords: Vec<String>,
2023-06-16 07:58:07 +00:00
// 3.6.6 Not implemented
// 3.6.7 Trace Fields
pub return_path: Vec<MailboxRef>,
pub received: Vec<&'a str>,
2023-06-13 14:22:04 +00:00
// 3.6.8. Optional Fields
2023-06-08 19:43:32 +00:00
pub optional: HashMap<&'a str, String>,
2023-06-16 15:24:51 +00:00
// Recovery
pub bad_fields: Vec<Field<'a>>,
2023-06-16 08:50:37 +00:00
pub unparsed: Vec<&'a str>,
2023-06-13 15:47:57 +00:00
}