diff options
Diffstat (limited to 'core/src/resource/data.rs')
-rw-r--r-- | core/src/resource/data.rs | 122 |
1 files changed, 52 insertions, 70 deletions
diff --git a/core/src/resource/data.rs b/core/src/resource/data.rs index 5affa59..43fe657 100644 --- a/core/src/resource/data.rs +++ b/core/src/resource/data.rs @@ -1,25 +1,14 @@ use std::{ - sync::Arc, default::Default, - ops::{Deref, DerefMut} + ops::{Deref, DerefMut}, + sync::Arc, }; -#[cfg(feature="serde")] -use serde::{ - Serialize, Deserialize, - ser::{Serializer}, - de::{Deserializer} -}; +#[cfg(feature = "serde")] +use serde::{de::Deserializer, ser::Serializer, Deserialize, Serialize}; +use headers::header_components::{ContentId, FileMeta, MediaType, TransferEncoding}; use internals::bind::{base64, quoted_printable}; -use headers::header_components::{ - MediaType, - FileMeta, - TransferEncoding, - ContentId -}; - - /// POD type containing FileMeta, Content-Type and Content-Id /// @@ -38,17 +27,17 @@ use headers::header_components::{ /// be used for some caching and similar but that plays hardly any /// role any more, except maybe for "external" mail bodies. #[derive(Debug, Clone)] -#[cfg_attr(feature="serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct Metadata { /// File meta like file name or file read time. - #[cfg_attr(feature="serde", serde(flatten))] + #[cfg_attr(feature = "serde", serde(flatten))] pub file_meta: FileMeta, /// The media type of the data. pub media_type: MediaType, /// The content id associated with the data. - pub content_id: ContentId + pub content_id: ContentId, } impl Deref for Metadata { @@ -80,26 +69,21 @@ impl DerefMut for Metadata { /// `Data` is made to be cheap to clone and share. /// For this it uses `Arc` internally. #[derive(Debug, Clone)] -#[cfg_attr(feature="serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct Data { - #[cfg_attr(feature="serde", serde(with="arc_buffer_serde"))] + #[cfg_attr(feature = "serde", serde(with = "arc_buffer_serde"))] buffer: Arc<[u8]>, - #[cfg_attr(feature="serde", serde(flatten))] - #[cfg_attr(feature="serde", serde(with="arc_serde"))] - meta: Arc<Metadata> + #[cfg_attr(feature = "serde", serde(flatten))] + #[cfg_attr(feature = "serde", serde(with = "arc_serde"))] + meta: Arc<Metadata>, } - impl Data { - /// Create a new data instance. - pub fn new( - buffer: impl Into<Arc<[u8]>>, - meta: impl Into<Arc<Metadata>> - ) -> Self { + pub fn new(buffer: impl Into<Arc<[u8]>>, meta: impl Into<Arc<Metadata>>) -> Self { Data { buffer: buffer.into(), - meta: meta.into() + meta: meta.into(), } } @@ -109,7 +93,7 @@ impl Data { let meta = Metadata { file_meta: Default::default(), media_type: MediaType::parse("text/plain; charset=utf-8").unwrap(), - content_id: cid + content_id: cid, }; Self::new(buf, meta) } @@ -149,10 +133,7 @@ impl Data { /// This functions expect a boundary pool and will remove all boundaries /// which do appear in the encoded representation of the data. #[inline(always)] - pub fn transfer_encode( - &self, - encoding_hint: TransferEncodingHint, - ) -> EncData { + pub fn transfer_encode(&self, encoding_hint: TransferEncodingHint) -> EncData { // delegated to free function at end of file for // readability transfer_encode(self, encoding_hint) @@ -166,18 +147,17 @@ impl Data { /// `Data` is made to be cheap to clone and share. /// For this it uses `Arc` internally. #[derive(Debug, Clone)] -#[cfg_attr(feature="serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct EncData { - #[cfg_attr(feature="serde", serde(with="arc_buffer_serde"))] + #[cfg_attr(feature = "serde", serde(with = "arc_buffer_serde"))] buffer: Arc<[u8]>, - #[cfg_attr(feature="serde", serde(flatten))] - #[cfg_attr(feature="serde", serde(with="arc_serde"))] + #[cfg_attr(feature = "serde", serde(flatten))] + #[cfg_attr(feature = "serde", serde(with = "arc_serde"))] meta: Arc<Metadata>, - encoding: TransferEncoding + encoding: TransferEncoding, } impl EncData { - /// Create a new instance from transfer encoded data /// as well as metadata and the encoding used to transfer /// encode the data. @@ -188,12 +168,12 @@ impl EncData { pub(crate) fn new( buffer: impl Into<Arc<[u8]>>, meta: impl Into<Arc<Metadata>>, - encoding: TransferEncoding + encoding: TransferEncoding, ) -> Self { EncData { buffer: buffer.into(), meta: meta.into(), - encoding + encoding, } } @@ -217,7 +197,6 @@ impl EncData { &self.meta.media_type } - /// Access the transfer encoding used to encode the buffer. pub fn encoding(&self) -> TransferEncoding { self.encoding @@ -243,7 +222,7 @@ impl EncData { /// Hint to change how data should be transfer encoded. #[derive(Debug, PartialEq)] -#[cfg_attr(feature="serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub enum TransferEncodingHint { /// Use Base64 encoding. UseBase64, @@ -258,13 +237,12 @@ pub enum TransferEncodingHint { // /// Note: This is the default until I'm more sure about the whole thing // /// with puthing things in unecoded. // DoNotUseNoEncoding, - /// No hint for transfer encoding. NoHint, - #[cfg_attr(feature="serde", serde(skip))] + #[cfg_attr(feature = "serde", serde(skip))] #[doc(hidden)] - __NonExhaustive { } + __NonExhaustive {}, } impl Default for TransferEncodingHint { @@ -283,68 +261,72 @@ impl Default for TransferEncodingHint { /// /// Panics if TransferEncodingHint::__NonExhaustive /// is passed to the function. -fn transfer_encode( - data: &Data, - encoding_hint: TransferEncodingHint, -) -> EncData { +fn transfer_encode(data: &Data, encoding_hint: TransferEncodingHint) -> EncData { use self::TransferEncodingHint::*; match encoding_hint { UseQuotedPrintable => tenc_quoted_printable(data), UseBase64 | NoHint => tenc_base64(data), - __NonExhaustive { .. } => panic!("__NonExhaustive encoding should not be passed to any place") + __NonExhaustive { .. } => { + panic!("__NonExhaustive encoding should not be passed to any place") + } } } fn tenc_base64(data: &Data) -> EncData { - let enc_data = base64::normal_encode(data.buffer()) - .into_bytes(); + let enc_data = base64::normal_encode(data.buffer()).into_bytes(); - EncData::new(enc_data, data.metadata().clone(), - TransferEncoding::Base64) + EncData::new(enc_data, data.metadata().clone(), TransferEncoding::Base64) } fn tenc_quoted_printable(data: &Data) -> EncData { - let enc_data = quoted_printable::normal_encode(data.buffer()) - .into_bytes(); + let enc_data = quoted_printable::normal_encode(data.buffer()).into_bytes(); - EncData::new(enc_data, data.metadata().clone(), - TransferEncoding::QuotedPrintable) + EncData::new( + enc_data, + data.metadata().clone(), + TransferEncoding::QuotedPrintable, + ) } - -#[cfg(feature="serde")] +#[cfg(feature = "serde")] mod arc_buffer_serde { use super::*; pub(crate) fn deserialize<'de, D>(deserializer: D) -> Result<Arc<[u8]>, D::Error> - where D: Deserializer<'de> + where + D: Deserializer<'de>, { let bytes = <Vec<u8>>::deserialize(deserializer)?; Ok(bytes.into()) } pub(crate) fn serialize<S>(data: &Arc<[u8]>, serializer: S) -> Result<S::Ok, S::Error> - where S: Serializer + where + S: Serializer, { serializer.serialize_bytes(data) } } -#[cfg(feature="serde")] +#[cfg(feature = "serde")] mod arc_serde { use super::*; pub(crate) fn deserialize<'de, OUT, D>(deserializer: D) -> Result<Arc<OUT>, D::Error> - where D: Deserializer<'de>, OUT: Deserialize<'de> + where + D: Deserializer<'de>, + OUT: Deserialize<'de>, { let value = OUT::deserialize(deserializer)?; Ok(Arc::new(value)) } pub(crate) fn serialize<S, IN>(data: &Arc<IN>, serializer: S) -> Result<S::Ok, S::Error> - where S: Serializer, IN: Serialize + where + S: Serializer, + IN: Serialize, { IN::serialize(&**data, serializer) } -}
\ No newline at end of file +} |