diff options
Diffstat (limited to 'headers/src/header_components/disposition.rs')
-rw-r--r-- | headers/src/header_components/disposition.rs | 131 |
1 files changed, 58 insertions, 73 deletions
diff --git a/headers/src/header_components/disposition.rs b/headers/src/header_components/disposition.rs index 575f900..0a1f75a 100644 --- a/headers/src/header_components/disposition.rs +++ b/headers/src/header_components/disposition.rs @@ -1,35 +1,32 @@ use std::borrow::Cow; -#[cfg(feature="serde")] +#[cfg(feature = "serde")] use std::fmt; use failure::Fail; -use soft_ascii_string::SoftAsciiStr; use media_type::push_params_to_buffer; -use media_type::spec::{MimeSpec, Ascii, Modern, Internationalized}; +use media_type::spec::{Ascii, Internationalized, MimeSpec, Modern}; +use soft_ascii_string::SoftAsciiStr; -#[cfg(feature="serde")] -use serde::{ - Serialize, Serializer, - Deserialize, Deserializer, -}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use internals::error::{EncodingError, EncodingErrorKind}; +use error::ComponentCreationError; use internals::encoder::{EncodableInHeader, EncodingWriter}; -use ::HeaderTryFrom; -use ::error::ComponentCreationError; +use internals::error::{EncodingError, EncodingErrorKind}; +use HeaderTryFrom; use super::FileMeta; /// Disposition Component mainly used for the Content-Disposition header (rfc2183) #[derive(Debug, Clone, Eq, PartialEq, Hash)] -#[cfg_attr(feature="serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct Disposition { kind: DispositionKind, - file_meta: DispositionParameters + file_meta: DispositionParameters, } #[derive(Debug, Clone, Eq, PartialEq, Hash, Default)] -#[cfg_attr(feature="serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] struct DispositionParameters(FileMeta); /// Represents what kind of disposition is used (Inline/Attachment) @@ -41,61 +38,62 @@ pub enum DispositionKind { /// and then refers to it through its cid (e.g. in a html mail). Inline, /// Display the body as an attachment to of the mail. - Attachment + Attachment, } impl Disposition { - /// Create a inline disposition with default parameters. pub fn inline() -> Self { - Disposition::new( DispositionKind::Inline, FileMeta::default() ) + Disposition::new(DispositionKind::Inline, FileMeta::default()) } /// Create a attachment disposition with default parameters. pub fn attachment() -> Self { - Disposition::new( DispositionKind::Attachment, FileMeta::default() ) + Disposition::new(DispositionKind::Attachment, FileMeta::default()) } /// Create a new disposition with given parameters. - pub fn new( kind: DispositionKind, file_meta: FileMeta ) -> Self { - Disposition { kind, file_meta: DispositionParameters( file_meta ) } + pub fn new(kind: DispositionKind, file_meta: FileMeta) -> Self { + Disposition { + kind, + file_meta: DispositionParameters(file_meta), + } } /// Return which kind of disposition this represents. - pub fn kind( &self ) -> DispositionKind { + pub fn kind(&self) -> DispositionKind { self.kind } /// Returns the parameters associated with the disposition. - pub fn file_meta( &self ) -> &FileMeta { + pub fn file_meta(&self) -> &FileMeta { &self.file_meta } /// Returns a mutable reference to the parameters associated with the disposition. - pub fn file_meta_mut( &mut self ) -> &mut FileMeta { + pub fn file_meta_mut(&mut self) -> &mut FileMeta { &mut self.file_meta } - } -#[cfg(feature="serde")] +#[cfg(feature = "serde")] impl Serialize for DispositionKind { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> - where S: Serializer + where + S: Serializer, { match self { - &DispositionKind::Inline => - serializer.serialize_str("inline"), - &DispositionKind::Attachment => - serializer.serialize_str("attachment") + &DispositionKind::Inline => serializer.serialize_str("inline"), + &DispositionKind::Attachment => serializer.serialize_str("attachment"), } } } -#[cfg(feature="serde")] +#[cfg(feature = "serde")] impl<'de> Deserialize<'de> for DispositionKind { fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where D: Deserializer<'de> + where + D: Deserializer<'de>, { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { @@ -106,16 +104,15 @@ impl<'de> Deserialize<'de> for DispositionKind { } fn visit_str<E>(self, value: &str) -> Result<Self::Value, E> - where E: ::serde::de::Error, + where + E: ::serde::de::Error, { if value.eq_ignore_ascii_case("inline") { Ok(DispositionKind::Inline) } else if value.eq_ignore_ascii_case("attachment") { Ok(DispositionKind::Attachment) } else { - Err(E::custom(format!( - "unknown disposition: {:?}", value - ))) + Err(E::custom(format!("unknown disposition: {:?}", value))) } } } @@ -142,12 +139,10 @@ impl<'a> HeaderTryFrom<&'a str> for Disposition { } } - //TODO provide a gnneral way for encoding header parameter ... // which follow the scheme: <mainvalue> *(";" <key>"="<value> ) // this are: ContentType and ContentDisposition for now impl EncodableInHeader for DispositionParameters { - fn encode(&self, handle: &mut EncodingWriter) -> Result<(), EncodingError> { let mut params = Vec::<(&str, Cow<str>)>::new(); if let Some(filename) = self.file_name.as_ref() { @@ -169,21 +164,14 @@ impl EncodableInHeader for DispositionParameters { //TODO instead do optCFWS ; spCFWS <name>=<value> // so that soft line brakes can be done let mut buff = String::new(); - let res = - if handle.mail_type().is_internationalized() { - push_params_to_buffer::<MimeSpec<Internationalized, Modern>, _, _, _>( - &mut buff, params - ) - } else { - push_params_to_buffer::<MimeSpec<Ascii, Modern>, _, _, _>( - &mut buff, params - ) - }; + let res = if handle.mail_type().is_internationalized() { + push_params_to_buffer::<MimeSpec<Internationalized, Modern>, _, _, _>(&mut buff, params) + } else { + push_params_to_buffer::<MimeSpec<Ascii, Modern>, _, _, _>(&mut buff, params) + }; match res { - Err(err) => { - Err(err.context(EncodingErrorKind::Malformed).into()) - }, + Err(err) => Err(err.context(EncodingErrorKind::Malformed).into()), Ok(_) => { handle.write_str_unchecked(&*buff)?; Ok(()) @@ -196,21 +184,19 @@ impl EncodableInHeader for DispositionParameters { } } - impl EncodableInHeader for Disposition { - fn encode(&self, handle: &mut EncodingWriter) -> Result<(), EncodingError> { use self::DispositionKind::*; match self.kind { Inline => { handle.write_str(SoftAsciiStr::from_unchecked("inline"))?; - }, + } Attachment => { handle.write_str(SoftAsciiStr::from_unchecked("attachment"))?; } } - self.file_meta.encode( handle )?; - Ok( () ) + self.file_meta.encode(handle)?; + Ok(()) } fn boxed_clone(&self) -> Box<EncodableInHeader> { @@ -218,8 +204,7 @@ impl EncodableInHeader for Disposition { } } - -deref0!{+mut DispositionParameters => FileMeta } +deref0! {+mut DispositionParameters => FileMeta } #[cfg(test)] mod test { @@ -228,24 +213,24 @@ mod test { use super::*; - pub fn test_time( modif: u32 ) -> chrono::DateTime<chrono::Utc> { + pub fn test_time(modif: u32) -> chrono::DateTime<chrono::Utc> { use chrono::prelude::*; - Utc.ymd( 2013, 8, 6 ).and_hms( 7, 11, modif ) + Utc.ymd(2013, 8, 6).and_hms(7, 11, modif) } - ec_test!{ no_params_inline, { + ec_test! { no_params_inline, { Disposition::inline() } => ascii => [ Text "inline" ]} - ec_test!{ no_params_attachment, { + ec_test! { no_params_attachment, { Disposition::attachment() } => ascii => [ Text "attachment" ]} - ec_test!{ attachment_encode_file_name, { + ec_test! { attachment_encode_file_name, { Disposition::new( DispositionKind::Attachment, FileMeta { file_name: Some("this is nice".to_owned()), ..Default::default() @@ -254,7 +239,7 @@ mod test { Text "attachment; filename=\"this is nice\"" ]} - ec_test!{ attachment_all_params, { + ec_test! { attachment_all_params, { Disposition::new( DispositionKind::Attachment, FileMeta { file_name: Some( "random.png".to_owned() ), creation_date: Some( test_time( 1 ) ), @@ -271,7 +256,7 @@ mod test { "; size=4096" ), ]} - ec_test!{ inline_file_name_param, { + ec_test! { inline_file_name_param, { Disposition::new(DispositionKind::Inline, FileMeta { file_name: Some("logo.png".to_owned()), ..Default::default() @@ -283,19 +268,19 @@ mod test { #[test] fn test_from_str() { - assert_ok!( Disposition::try_from( "Inline" ) ); - assert_ok!( Disposition::try_from( "InLine" ) ); - assert_ok!( Disposition::try_from( "Attachment" ) ); + assert_ok!(Disposition::try_from("Inline")); + assert_ok!(Disposition::try_from("InLine")); + assert_ok!(Disposition::try_from("Attachment")); - assert_err!( Disposition::try_from( "In line") ); + assert_err!(Disposition::try_from("In line")); } - #[cfg(feature="serde")] + #[cfg(feature = "serde")] fn assert_serialize<S: ::serde::Serialize>() {} - #[cfg(feature="serde")] + #[cfg(feature = "serde")] fn assert_deserialize<S: ::serde::Serialize>() {} - #[cfg(feature="serde")] + #[cfg(feature = "serde")] #[test] fn disposition_serialization() { assert_serialize::<Disposition>(); @@ -305,4 +290,4 @@ mod test { assert_deserialize::<DispositionKind>(); assert_deserialize::<DispositionParameters>(); } -}
\ No newline at end of file +} |