mailbox/header/
content_transfer_encoding.rs1use std::io;
16use stream::entry::header;
17use super::Header;
18use casing::Casing;
19
20#[derive(Eq, PartialEq, Clone, Debug)]
21pub enum ContentTransferEncoding {
22 Ascii,
23 ExtendedAscii,
24 Binary,
25 QuotedPrintable,
26 Base64,
27 Token(String),
28}
29
30impl Header for ContentTransferEncoding {
31 #[inline(always)]
32 fn name() -> &'static str {
33 "Content-Transfer-Encoding"
34 }
35
36 #[inline]
37 fn parse(values: &[header::Item]) -> io::Result<Self> {
38 Ok(match values[0].lower(Default::default()).as_ref() {
39 "7bit" => ContentTransferEncoding::Ascii,
40 "8bit" => ContentTransferEncoding::ExtendedAscii,
41 "binary" => ContentTransferEncoding::Binary,
42 "quoted-printable" => ContentTransferEncoding::QuotedPrintable,
43 "base64" => ContentTransferEncoding::Base64,
44 token => ContentTransferEncoding::Token(token.into()),
45 })
46 }
47}
48
49#[cfg(test)]
50mod test {
51 use super::*;
52 use stream::entry::header;
53 use header::Header;
54
55 macro_rules! parse {
56 ($str:expr) => (
57 <ContentTransferEncoding as Header>::parse(&[header::item($str)])
58 );
59 }
60
61 #[test]
62 fn insensitive() {
63 assert_eq!(parse!("7Bit").unwrap(), ContentTransferEncoding::Ascii);
64 assert_eq!(parse!("bAsE64").unwrap(), ContentTransferEncoding::Base64);
65 }
66
67 #[test]
68 fn ascii() {
69 assert_eq!(parse!("7BiT").unwrap(), ContentTransferEncoding::Ascii);
70 assert_eq!(parse!("7bit").unwrap(), ContentTransferEncoding::Ascii);
71 }
72
73 #[test]
74 fn extended_ascii() {
75 assert_eq!(parse!("8BiT").unwrap(), ContentTransferEncoding::ExtendedAscii);
76 assert_eq!(parse!("8bit").unwrap(), ContentTransferEncoding::ExtendedAscii);
77 }
78}