use std::fmt;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub enum TransferEncoding {
Identity,
QuotedPrintable,
Base64,
SevenBit,
EightBit,
Binary,
UUEncode,
}
impl fmt::Display for TransferEncoding {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
TransferEncoding::Identity => f.write_str("identity"),
TransferEncoding::QuotedPrintable => f.write_str("quoted-printable"),
TransferEncoding::Base64 => f.write_str("base64"),
TransferEncoding::SevenBit => f.write_str("7bit"),
TransferEncoding::EightBit => f.write_str("8bit"),
TransferEncoding::Binary => f.write_str("binary"),
TransferEncoding::UUEncode => f.write_str("x-uuencode"),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ParsedHeader {
pub name: String,
pub value: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ParsedPart {
pub part_id: String,
pub content_type: String,
pub charset: Option<String>,
pub transfer_encoding: TransferEncoding,
pub disposition: Option<String>,
pub filename: Option<String>,
pub cid: Option<String>,
pub header_range: (u32, u32),
pub body_range: (u32, u32),
pub children: Vec<ParsedPart>,
pub is_encoding_problem: bool,
}
impl ParsedPart {
pub fn find_by_id(&self, id: &str) -> Option<&ParsedPart> {
if self.part_id == id {
return Some(self);
}
self.children.iter().find_map(|child| child.find_by_id(id))
}
}