emailmessage/header/
special.rs

1use hyperx::{
2    header::{Formatter as HeaderFormatter, Header, Raw},
3    Error as HyperError, Result as HyperResult,
4};
5use std::fmt::Result as FmtResult;
6use std::str::from_utf8;
7
8#[derive(Debug, Clone, PartialEq)]
9pub struct MimeVersion {
10    pub major: u8,
11    pub minor: u8,
12}
13
14pub const MIME_VERSION_1_0: MimeVersion = MimeVersion { major: 1, minor: 0 };
15
16impl MimeVersion {
17    pub fn new(major: u8, minor: u8) -> Self {
18        MimeVersion { major, minor }
19    }
20}
21
22impl Default for MimeVersion {
23    fn default() -> Self {
24        MIME_VERSION_1_0
25    }
26}
27
28impl Header for MimeVersion {
29    fn header_name() -> &'static str {
30        "MIME-Version"
31    }
32
33    fn parse_header(raw: &Raw) -> HyperResult<Self> {
34        raw.one().ok_or(HyperError::Header).and_then(|r| {
35            let s: Vec<&str> = from_utf8(r)
36                .map_err(|_| HyperError::Header)?
37                .split('.')
38                .collect();
39            if s.len() != 2 {
40                return Err(HyperError::Header);
41            }
42            let major = s[0].parse().map_err(|_| HyperError::Header)?;
43            let minor = s[1].parse().map_err(|_| HyperError::Header)?;
44            Ok(MimeVersion::new(major, minor))
45        })
46    }
47
48    fn fmt_header(&self, f: &mut HeaderFormatter) -> FmtResult {
49        f.fmt_line(&format!("{}.{}", self.major, self.minor))
50    }
51}
52
53#[cfg(test)]
54mod test {
55    use super::{MimeVersion, MIME_VERSION_1_0};
56    use hyperx::Headers;
57
58    #[test]
59    fn format_mime_version() {
60        let mut headers = Headers::new();
61
62        headers.set(MIME_VERSION_1_0);
63
64        assert_eq!(format!("{}", headers), "MIME-Version: 1.0\r\n");
65
66        headers.set(MimeVersion::new(0, 1));
67
68        assert_eq!(format!("{}", headers), "MIME-Version: 0.1\r\n");
69    }
70
71    #[test]
72    fn parse_mime_version() {
73        let mut headers = Headers::new();
74
75        headers.set_raw("MIME-Version", "1.0");
76
77        assert_eq!(headers.get::<MimeVersion>(), Some(&MIME_VERSION_1_0));
78
79        headers.set_raw("MIME-Version", "0.1");
80
81        assert_eq!(headers.get::<MimeVersion>(), Some(&MimeVersion::new(0, 1)));
82    }
83}