From db24b96292543c3eceb326e9e05e3c121f8719c7 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Sat, 5 Oct 2019 13:45:15 +0200 Subject: Move error type to own module Signed-off-by: Matthias Beyer --- src/error.rs | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/error.rs (limited to 'src/error.rs') diff --git a/src/error.rs b/src/error.rs new file mode 100644 index 0000000..251aafc --- /dev/null +++ b/src/error.rs @@ -0,0 +1,72 @@ +use std::error; +use std::fmt; +use std::ops::Deref; + +/// An error type that represents the different kinds of errors that may be +/// encountered during message parsing. +#[derive(Debug)] +pub enum MailParseError { + /// Data that was specified as being in the quoted-printable transfer-encoding + /// could not be successfully decoded as quoted-printable data. + QuotedPrintableDecodeError(quoted_printable::QuotedPrintableError), + /// Data that was specified as being in the base64 transfer-encoding could + /// not be successfully decoded as base64 data. + Base64DecodeError(base64::DecodeError), + /// An error occurred when converting the raw byte data to Rust UTF-8 string + /// format using the charset specified in the message. + EncodingError(std::borrow::Cow<'static, str>), + /// Some other error occurred while parsing the message; the description string + /// provides additional details. + Generic(&'static str), +} + +impl fmt::Display for MailParseError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + MailParseError::QuotedPrintableDecodeError(ref err) => { + write!(f, "QuotedPrintable decode error: {}", err) + } + MailParseError::Base64DecodeError(ref err) => write!(f, "Base64 decode error: {}", err), + MailParseError::EncodingError(ref err) => write!(f, "Encoding error: {}", err), + MailParseError::Generic(ref description) => write!(f, "{}", description), + } + } +} + +impl error::Error for MailParseError { + fn description(&self) -> &str { + match *self { + MailParseError::QuotedPrintableDecodeError(ref err) => err.description(), + MailParseError::Base64DecodeError(ref err) => err.description(), + MailParseError::EncodingError(ref err) => err.deref(), + _ => "An error occurred while attempting to parse the input", + } + } + + fn cause(&self) -> Option<&dyn error::Error> { + match *self { + MailParseError::QuotedPrintableDecodeError(ref err) => Some(err), + MailParseError::Base64DecodeError(ref err) => Some(err), + _ => None, + } + } +} + +impl From for MailParseError { + fn from(err: quoted_printable::QuotedPrintableError) -> MailParseError { + MailParseError::QuotedPrintableDecodeError(err) + } +} + +impl From for MailParseError { + fn from(err: base64::DecodeError) -> MailParseError { + MailParseError::Base64DecodeError(err) + } +} + +impl From> for MailParseError { + fn from(err: std::borrow::Cow<'static, str>) -> MailParseError { + MailParseError::EncodingError(err) + } +} + -- cgit v1.2.3