email_rs/
header_value_parser.rs1#[derive(Debug)]
7pub enum EmailHeader {
8 ContentTransferEncoding(String),
10
11 ContentType {
16 maintype: String,
17 subtype: String,
18 value: String,
19 },
20
21 Date(String),
23
24 To(String),
26
27 From(String),
29
30 Subject(String),
32
33 MessageID(String),
35
36 GenericHeader { key: String, value: String },
39}
40
41pub 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
56fn 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}