Initial work for adding errors
This commit is contained in:
parent
923339e5f0
commit
6c826625fd
4 changed files with 72 additions and 8 deletions
|
|
@ -1,9 +1,11 @@
|
||||||
use std::net::{TcpStream, ToSocketAddrs};
|
use std::net::{TcpStream, ToSocketAddrs};
|
||||||
use openssl::ssl::{SslContext, SslStream};
|
use openssl::ssl::{SslContext, SslStream};
|
||||||
use std::io::{Error, ErrorKind, Read, Result, Write};
|
use std::io::{ErrorKind, Read, Write};
|
||||||
|
use std::io::{self};
|
||||||
|
|
||||||
use super::mailbox::Mailbox;
|
use super::mailbox::Mailbox;
|
||||||
use super::parse::{parse_response_ok, parse_capability, parse_select_or_examine};
|
use super::parse::{parse_response_ok, parse_capability, parse_select_or_examine};
|
||||||
|
use super::error::{Error, Result};
|
||||||
|
|
||||||
static TAG_PREFIX: &'static str = "a";
|
static TAG_PREFIX: &'static str = "a";
|
||||||
const INITIAL_TAG: u32 = 0;
|
const INITIAL_TAG: u32 = 0;
|
||||||
|
|
@ -27,7 +29,7 @@ impl Client<TcpStream> {
|
||||||
try!(socket.read_greeting());
|
try!(socket.read_greeting());
|
||||||
Ok(socket)
|
Ok(socket)
|
||||||
},
|
},
|
||||||
Err(e) => Err(e)
|
Err(e) => Err(Error::Io(e))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -45,7 +47,7 @@ impl Client<SslStream<TcpStream>> {
|
||||||
try!(socket.read_greeting());
|
try!(socket.read_greeting());
|
||||||
Ok(socket)
|
Ok(socket)
|
||||||
},
|
},
|
||||||
Err(e) => Err(e)
|
Err(e) => Err(Error::Io(e))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -159,7 +161,7 @@ impl<T: Read+Write> Client<T> {
|
||||||
|
|
||||||
match self.stream.write_fmt(format_args!("{}", &*command)) {
|
match self.stream.write_fmt(format_args!("{}", &*command)) {
|
||||||
Ok(_) => (),
|
Ok(_) => (),
|
||||||
Err(_) => return Err(Error::new(ErrorKind::Other, "Failed to write")),
|
Err(_) => return Err(Error::Io(io::Error::new(io::ErrorKind::Other, "Failed to write"))),
|
||||||
};
|
};
|
||||||
|
|
||||||
self.read_response()
|
self.read_response()
|
||||||
|
|
@ -204,7 +206,7 @@ impl<T: Read+Write> Client<T> {
|
||||||
let byte_buffer: &mut [u8] = &mut [0];
|
let byte_buffer: &mut [u8] = &mut [0];
|
||||||
match self.stream.read(byte_buffer) {
|
match self.stream.read(byte_buffer) {
|
||||||
Ok(_) => {},
|
Ok(_) => {},
|
||||||
Err(_) => return Err(Error::new(ErrorKind::Other, "Failed to read line")),
|
Err(_) => return Err(Error::Io(io::Error::new(io::ErrorKind::Other, "Failed to read line"))),
|
||||||
}
|
}
|
||||||
line_buffer.push(byte_buffer[0]);
|
line_buffer.push(byte_buffer[0]);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
60
src/error.rs
Normal file
60
src/error.rs
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
extern crate openssl;
|
||||||
|
|
||||||
|
use std::io::{self};
|
||||||
|
use std::result;
|
||||||
|
use std::fmt::{self};
|
||||||
|
use std::error::Error as StdError;
|
||||||
|
|
||||||
|
use openssl::ssl::error::SslError;
|
||||||
|
|
||||||
|
pub type Result<T> = result::Result<T, Error>;
|
||||||
|
|
||||||
|
/// A set of errors that can occur in the IMAP client
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum Error {
|
||||||
|
Io(io::Error),
|
||||||
|
Ssl(SslError),
|
||||||
|
BadResponse(Vec<String>),
|
||||||
|
NoResponse(Vec<String>),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<io::Error> for Error {
|
||||||
|
fn from(err: io::Error) -> Error {
|
||||||
|
Error::Io(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<SslError> for Error {
|
||||||
|
fn from(err: SslError) -> Error {
|
||||||
|
Error::Ssl(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for Error {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
match *self {
|
||||||
|
Error::Io(ref e) => fmt::Display::fmt(e, f),
|
||||||
|
Error::Ssl(ref e) => fmt::Display::fmt(e, f),
|
||||||
|
ref e => f.write_str(e.description()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl StdError for Error {
|
||||||
|
fn description(&self) -> &str {
|
||||||
|
match *self {
|
||||||
|
Error::Io(ref e) => e.description(),
|
||||||
|
Error::Ssl(ref e) => e.description(),
|
||||||
|
Error::BadResponse(_) => "Bad Response",
|
||||||
|
Error::NoResponse(_) => "No Response"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn cause(&self) -> Option<&StdError> {
|
||||||
|
match *self {
|
||||||
|
Error::Io(ref e) => Some(e),
|
||||||
|
Error::Ssl(ref e) => Some(e),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -7,6 +7,7 @@ extern crate openssl;
|
||||||
extern crate regex;
|
extern crate regex;
|
||||||
|
|
||||||
pub mod client;
|
pub mod client;
|
||||||
|
pub mod error;
|
||||||
pub mod mailbox;
|
pub mod mailbox;
|
||||||
|
|
||||||
mod parse;
|
mod parse;
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
use std::io::{Error, ErrorKind, Result};
|
use std::io::{self};
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
|
|
||||||
use super::mailbox::Mailbox;
|
use super::mailbox::Mailbox;
|
||||||
|
use super::error::{Error, Result};
|
||||||
|
|
||||||
pub fn parse_capability(lines: Vec<String>) -> Result<Vec<String>> {
|
pub fn parse_capability(lines: Vec<String>) -> Result<Vec<String>> {
|
||||||
let capability_regex = Regex::new(r"^\* CAPABILITY (.*)\r\n").unwrap();
|
let capability_regex = Regex::new(r"^\* CAPABILITY (.*)\r\n").unwrap();
|
||||||
|
|
@ -20,7 +21,7 @@ pub fn parse_capability(lines: Vec<String>) -> Result<Vec<String>> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Err(Error::new(ErrorKind::Other, "Error parsing capabilities response"))
|
Err(Error::Io(io::Error::new(io::ErrorKind::Other, "Error parsing capabilities response")))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse_response_ok(lines: Vec<String>) -> Result<()> {
|
pub fn parse_response_ok(lines: Vec<String>) -> Result<()> {
|
||||||
|
|
@ -34,7 +35,7 @@ pub fn parse_response_ok(lines: Vec<String>) -> Result<()> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Err(Error::new(ErrorKind::Other, format!("Invalid Response: {}", last_line).to_string()));
|
Err(Error::Io(io::Error::new(io::ErrorKind::Other, format!("Invalid Response: {}", last_line).to_string())))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse_select_or_examine(lines: Vec<String>) -> Result<Mailbox> {
|
pub fn parse_select_or_examine(lines: Vec<String>) -> Result<Mailbox> {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue