error.rs

  1// Copyright (c) 2017 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
  2//
  3// This Source Code Form is subject to the terms of the Mozilla Public
  4// License, v. 2.0. If a copy of the MPL was not distributed with this
  5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
  6
  7use std::convert::From;
  8use std::io;
  9use std::num;
 10use std::string;
 11use std::fmt;
 12use std::error;
 13
 14use base64;
 15use minidom;
 16use jid;
 17use chrono;
 18
 19#[derive(Debug)]
 20pub enum Error {
 21    ParseError(&'static str),
 22    IoError(io::Error),
 23    XMLError(minidom::Error),
 24    Base64Error(base64::DecodeError),
 25    ParseIntError(num::ParseIntError),
 26    ParseStringError(string::ParseError),
 27    JidParseError(jid::JidParseError),
 28    ChronoParseError(chrono::ParseError),
 29}
 30
 31impl fmt::Display for Error {
 32    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
 33        match *self {
 34            Error::ParseError(s) => write!(fmt, "{}", s),
 35            Error::IoError(ref e) => write!(fmt, "{}", e),
 36            Error::XMLError(ref e) => write!(fmt, "{}", e),
 37            Error::Base64Error(ref e) => write!(fmt, "{}", e),
 38            Error::ParseIntError(ref e) => write!(fmt, "{}", e),
 39            Error::ParseStringError(ref e) => write!(fmt, "{}", e),
 40            Error::JidParseError(_) => write!(fmt, "JID parse error"),
 41            Error::ChronoParseError(ref e) => write!(fmt, "{}", e),
 42        }
 43    }
 44}
 45
 46impl error::Error for Error {
 47    fn description(&self) -> &str {
 48        match *self {
 49            Error::ParseError(s) => s,
 50            Error::IoError(ref e) => e.description(),
 51            Error::XMLError(ref e) => e.description(),
 52            Error::Base64Error(ref e) => e.description(),
 53            Error::ParseIntError(ref e) => e.description(),
 54            Error::ParseStringError(ref e) => e.description(),
 55            Error::JidParseError(_) => "JID parse error",
 56            Error::ChronoParseError(ref e) => e.description(),
 57        }
 58    }
 59}
 60
 61impl From<io::Error> for Error {
 62    fn from(err: io::Error) -> Error {
 63        Error::IoError(err)
 64    }
 65}
 66
 67impl From<minidom::Error> for Error {
 68    fn from(err: minidom::Error) -> Error {
 69        Error::XMLError(err)
 70    }
 71}
 72
 73impl From<base64::DecodeError> for Error {
 74    fn from(err: base64::DecodeError) -> Error {
 75        Error::Base64Error(err)
 76    }
 77}
 78
 79impl From<num::ParseIntError> for Error {
 80    fn from(err: num::ParseIntError) -> Error {
 81        Error::ParseIntError(err)
 82    }
 83}
 84
 85impl From<string::ParseError> for Error {
 86    fn from(err: string::ParseError) -> Error {
 87        Error::ParseStringError(err)
 88    }
 89}
 90
 91impl From<jid::JidParseError> for Error {
 92    fn from(err: jid::JidParseError) -> Error {
 93        Error::JidParseError(err)
 94    }
 95}
 96
 97impl From<chrono::ParseError> for Error {
 98    fn from(err: chrono::ParseError) -> Error {
 99        Error::ChronoParseError(err)
100    }
101}