emailmessage/header/
special.rs1use 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}