lettre/message/header/
textual.rs1use super::{Header, HeaderName, HeaderValue};
2use crate::BoxError;
3
4macro_rules! text_header {
5    ($(#[$attr:meta])* Header($type_name: ident, $header_name: expr )) => {
6        $(#[$attr])*
7        #[derive(Debug, Clone, PartialEq, Eq)]
8        pub struct $type_name(String);
9
10        impl Header for $type_name {
11            fn name() -> HeaderName {
12                HeaderName::new_from_ascii_str($header_name)
13            }
14
15            fn parse(s: &str) -> Result<Self, BoxError> {
16                Ok(Self(s.into()))
17            }
18
19            fn display(&self) -> HeaderValue {
20             HeaderValue::new(Self::name(),   self.0.clone())
21            }
22        }
23
24        impl From<String> for $type_name {
25            #[inline]
26            fn from(text: String) -> Self {
27                Self(text)
28            }
29        }
30
31        impl AsRef<str> for $type_name {
32            #[inline]
33            fn as_ref(&self) -> &str {
34                &self.0
35            }
36        }
37    };
38}
39
40text_header!(
41    Header(Subject, "Subject")
43);
44text_header!(
45    Header(Comments, "Comments")
47);
48text_header!(
49    Header(Keywords, "Keywords")
52);
53text_header!(
54    Header(InReplyTo, "In-Reply-To")
58);
59text_header!(
60    Header(References, "References")
64);
65text_header!(
66    Header(MessageId, "Message-ID")
69);
70text_header!(
71    Header(UserAgent, "User-Agent")
74);
75text_header! {
76    Header(ContentId, "Content-ID")
79}
80text_header! {
81    Header(ContentLocation, "Content-Location")
84}
85
86#[cfg(test)]
87mod test {
88    use pretty_assertions::assert_eq;
89
90    use super::Subject;
91    use crate::message::header::{HeaderName, HeaderValue, Headers};
92
93    #[test]
94    fn format_ascii() {
95        let mut headers = Headers::new();
96        headers.set(Subject("Sample subject".into()));
97
98        assert_eq!(headers.to_string(), "Subject: Sample subject\r\n");
99    }
100
101    #[test]
102    fn format_utf8() {
103        let mut headers = Headers::new();
104        headers.set(Subject("Тема сообщения".into()));
105
106        assert_eq!(
107            headers.to_string(),
108            "Subject: =?utf-8?b?0KLQtdC80LAg0YHQvtC+0LHRidC10L3QuNGP?=\r\n"
109        );
110    }
111
112    #[test]
113    fn format_utf8_word() {
114        let mut headers = Headers::new();
115        headers.set(Subject("Administratör".into()));
116
117        assert_eq!(
118            headers.to_string(),
119            "Subject: =?utf-8?b?QWRtaW5pc3RyYXTDtnI=?=\r\n"
120        );
121    }
122
123    #[test]
124    fn parse_ascii() {
125        let mut headers = Headers::new();
126        headers.insert_raw(HeaderValue::new(
127            HeaderName::new_from_ascii_str("Subject"),
128            "Sample subject".to_owned(),
129        ));
130
131        assert_eq!(
132            headers.get::<Subject>(),
133            Some(Subject("Sample subject".into()))
134        );
135    }
136}