summaryrefslogtreecommitdiffstats
path: root/headers/src/header_components/disposition.rs
diff options
context:
space:
mode:
Diffstat (limited to 'headers/src/header_components/disposition.rs')
-rw-r--r--headers/src/header_components/disposition.rs131
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
+}