diff --git a/src/error.rs b/src/error.rs index 361444c..4d2cd89 100644 --- a/src/error.rs +++ b/src/error.rs @@ -18,6 +18,8 @@ pub enum Error { BadResponse(Vec), /// A NO response from the IMAP server. NoResponse(Vec), + // Error parsing a server response. + Parse(ParseError) } impl From for Error { @@ -47,8 +49,9 @@ impl StdError for Error { match *self { Error::Io(ref e) => e.description(), Error::Ssl(ref e) => e.description(), + Error::Parse(ref e) => e.description(), Error::BadResponse(_) => "Bad Response", - Error::NoResponse(_) => "No Response" + Error::NoResponse(_) => "No Response", } } @@ -60,3 +63,34 @@ impl StdError for Error { } } } + +#[derive(Debug)] +pub enum ParseError { + // Indicates an error parsing the status response. Such as OK, NO, and BAD. + StatusResponse(Vec), + // Error parsing the cabability response. + Capability(Vec) +} + +impl fmt::Display for ParseError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + ref e => f.write_str(e.description()), + } + } +} + +impl StdError for ParseError { + fn description(&self) -> &str { + match *self { + ParseError::StatusResponse(_) => "Unable to parse status response", + ParseError::Capability(_) => "Unable to parse capability response" + } + } + + fn cause(&self) -> Option<&StdError> { + match *self { + _ => None + } + } +} diff --git a/src/parse.rs b/src/parse.rs index d8b522f..ef398c3 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -1,8 +1,7 @@ -use std::io::{self}; use regex::Regex; use super::mailbox::Mailbox; -use super::error::{Error, Result}; +use super::error::{Error, ParseError, Result}; pub fn parse_capability(lines: Vec) -> Result> { let capability_regex = Regex::new(r"^\* CAPABILITY (.*)\r\n").unwrap(); @@ -21,7 +20,7 @@ pub fn parse_capability(lines: Vec) -> Result> { } } - Err(Error::Io(io::Error::new(io::ErrorKind::Other, "Error parsing capabilities response"))) + Err(Error::Parse(ParseError::Capability(lines))) } pub fn parse_response_ok(lines: Vec) -> Result<()> { @@ -35,7 +34,7 @@ pub fn parse_response_ok(lines: Vec) -> Result<()> { } } - Err(Error::Io(io::Error::new(io::ErrorKind::Other, format!("Invalid Response: {}", last_line).to_string()))) + Err(Error::Parse(ParseError::StatusResponse(lines.clone()))) } pub fn parse_select_or_examine(lines: Vec) -> Result {