email_rs/
header_value_parser.rs

1// Parser for email header values.
2//
3// This returned structured parsing of the Email headers.
4
5/// EmailHeaders represents all the different types of headers we can have.
6#[derive(Debug)]
7pub enum EmailHeader {
8    /// Content-Transfer-Encoding header value.
9    ContentTransferEncoding(String),
10
11    /// Content-Type header value.
12    /// maintype: represents the maintype of the maintype/subtype. If this
13    /// value is 'multipart', then this email will have childrens, otherwise
14    /// not.
15    ContentType {
16        maintype: String,
17        subtype: String,
18        value: String,
19    },
20
21    /// Date header.
22    Date(String),
23
24    /// To header
25    To(String),
26
27    /// From header
28    From(String),
29
30    /// Subject header
31    Subject(String),
32
33    /// Message-ID header.
34    MessageID(String),
35
36    /// A GenericHeader represents all the headers we don't have special value
37    /// parsers for. It includes both the key and value of the email header.
38    GenericHeader { key: String, value: String },
39}
40
41/// Returns one of the EmailHeader based on the "key" type. The header's value
42/// might be further parsed depending on the type of the header.
43pub fn create_header(key: &str, value: &str) -> EmailHeader {
44    match key.to_lowercase().as_ref() {
45        "to" => parse_to(value),
46        "from" => parse_from(value),
47        "date" => parse_date(value),
48        "subject" => parse_subject(value),
49        "content-type" => parse_content_type(value),
50        "content-transfer-encoding" => parse_cte(value),
51        "message-id" => parse_message_id(value),
52        _ => parse_generic_header(key, value),
53    }
54}
55
56/// Parse the value of a To: header returning an email header object.
57fn parse_to(value: &str) -> EmailHeader {
58    EmailHeader::To(value.to_string())
59}
60
61fn parse_from(value: &str) -> EmailHeader {
62    EmailHeader::From(value.to_string())
63}
64
65fn parse_date(value: &str) -> EmailHeader {
66    EmailHeader::Date(value.to_string())
67}
68
69fn parse_subject(value: &str) -> EmailHeader {
70    EmailHeader::Subject(value.to_string())
71}
72
73fn parse_content_type(value: &str) -> EmailHeader {
74    let ctype: &str;
75    let mime_params: &str;
76
77    if value.contains(";") {
78        let vals: Vec<&str> = value.split(";").collect();
79        ctype = vals[0];
80    } else {
81        ctype = value;
82    }
83    let split_type: Vec<&str> = ctype.split("/").collect();
84
85    EmailHeader::ContentType {
86        maintype: split_type[0].to_string(),
87        subtype: split_type[1].to_string(),
88        value: value.to_string(),
89    }
90}
91
92fn parse_cte(value: &str) -> EmailHeader {
93    EmailHeader::ContentTransferEncoding(value.to_string())
94}
95
96fn parse_message_id(value: &str) -> EmailHeader {
97    EmailHeader::MessageID(value.to_string())
98}
99
100fn parse_generic_header(key: &str, value: &str) -> EmailHeader {
101    EmailHeader::GenericHeader {
102        key: key.to_string(),
103        value: value.to_string(),
104    }
105}