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}