mailbox/header/
content_transfer_encoding.rs

1//            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
2//                    Version 2, December 2004
3//
4// Copyleft (ↄ) meh. <meh@schizofreni.co> | http://meh.schizofreni.co
5//
6// Everyone is permitted to copy and distribute verbatim or modified
7// copies of this license document, and changing it is allowed as long
8// as the name is changed.
9//
10//            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
11//   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
12//
13//  0. You just DO WHAT THE FUCK YOU WANT TO.
14
15use 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}