summaryrefslogtreecommitdiffstats
path: root/headers/src/header_components/transfer_encoding.rs
diff options
context:
space:
mode:
Diffstat (limited to 'headers/src/header_components/transfer_encoding.rs')
-rw-r--r--headers/src/header_components/transfer_encoding.rs117
1 files changed, 117 insertions, 0 deletions
diff --git a/headers/src/header_components/transfer_encoding.rs b/headers/src/header_components/transfer_encoding.rs
new file mode 100644
index 0000000..4e5c4f1
--- /dev/null
+++ b/headers/src/header_components/transfer_encoding.rs
@@ -0,0 +1,117 @@
+use soft_ascii_string::SoftAsciiStr;
+
+use internals::error::EncodingError;
+use internals::encoder::{EncodingWriter, EncodableInHeader};
+
+#[cfg(feature="serde")]
+use serde::{Serialize, Deserialize};
+
+
+/// The TransferEnecoding header component mainly used by the ContentTransferEncodingHeader.
+#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
+#[cfg_attr(feature="serde", derive(Serialize, Deserialize))]
+pub enum TransferEncoding {
+ #[cfg_attr(feature="serde", serde(rename="7bit"))]
+ _7Bit,
+ #[cfg_attr(feature="serde", serde(rename="8bit"))]
+ _8Bit,
+ #[cfg_attr(feature="serde", serde(rename="binary"))]
+ Binary,
+ #[cfg_attr(feature="serde", serde(rename="quoted-printable"))]
+ QuotedPrintable,
+ #[cfg_attr(feature="serde", serde(rename="base64"))]
+ Base64
+}
+
+impl TransferEncoding {
+ pub fn repr(&self ) -> &SoftAsciiStr {
+ use self::TransferEncoding::*;
+ match *self {
+ _7Bit => SoftAsciiStr::from_unchecked("7bit"),
+ _8Bit => SoftAsciiStr::from_unchecked("8bit"),
+ Binary => SoftAsciiStr::from_unchecked("binary"),
+ QuotedPrintable => SoftAsciiStr::from_unchecked("quoted-printable"),
+ Base64 => SoftAsciiStr::from_unchecked("base64"),
+ }
+ }
+}
+
+
+impl EncodableInHeader for TransferEncoding {
+
+ fn encode(&self, handle: &mut EncodingWriter) -> Result<(), EncodingError> {
+ handle.write_str( self.repr() )?;
+ Ok( () )
+ }
+
+ fn boxed_clone(&self) -> Box<EncodableInHeader> {
+ Box::new(self.clone())
+ }
+}
+
+
+#[cfg(test)]
+mod test {
+ use super::TransferEncoding;
+
+ ec_test! {_7bit, {
+ TransferEncoding::_7Bit
+ } => ascii => [
+ Text "7bit"
+ ]}
+
+ ec_test! {_8bit, {
+ TransferEncoding::_8Bit
+ } => ascii => [
+ Text "8bit"
+ ]}
+
+ ec_test!{binary, {
+ TransferEncoding::Binary
+ } => ascii => [
+ Text "binary"
+ ]}
+
+ ec_test!{base64, {
+ TransferEncoding::Base64
+ } => ascii => [
+ Text "base64"
+ ]}
+
+ ec_test!{quoted_printable, {
+ TransferEncoding::QuotedPrintable
+ } => ascii => [
+ Text "quoted-printable"
+ ]}
+
+ #[cfg(feature="serde")]
+ mod serde {
+ use serde_test::{Token, assert_tokens};
+ use super::TransferEncoding;
+
+ macro_rules! serde_token_tests {
+ ($([$lname:ident, $hname:ident, $s:tt]),*) => ($(
+ #[test]
+ fn $lname() {
+ assert_tokens(&TransferEncoding::$hname, &[
+ Token::UnitVariant {
+ name: "TransferEncoding",
+ variant: $s
+ }
+ ])
+ }
+ )*);
+ }
+
+ serde_token_tests! {
+ [_7bit, _7Bit, "7bit"],
+ [_8bit, _8Bit, "8bit"],
+ [binary, Binary, "binary"],
+ [quoted_printable, QuotedPrintable, "quoted-printable"],
+ [base64, Base64, "base64"]
+ }
+
+ }
+}
+
+