1extern crate hyper;
6extern crate serde_json;
7
8use hyper::http::uri;
9use std::fmt;
10use std::io;
11
12pub type ErrorCollection = Vec<SwishClientError>;
13
14#[derive(Debug)]
15pub enum SwishClientError {
16 Swish(RequestError),
17 Parse(String),
18 Http(hyper::Error),
19 Uri(uri::InvalidUri),
20 Io(io::Error),
21 Json(serde_json::Error),
22 ErrorCollection(ErrorCollection),
23}
24
25impl fmt::Display for SwishClientError {
26 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
27 match *self {
28 SwishClientError::Swish(ref err) => write!(f, ": {}", err),
29 SwishClientError::Http(ref err) => write!(f, ": {}", err),
30 SwishClientError::Io(ref err) => write!(f, ": {}", err),
31 SwishClientError::Json(ref err) => write!(f, ": {}", err),
32 SwishClientError::Parse(ref err) => write!(f, ": {}", err),
33 SwishClientError::Uri(ref err) => write!(f, ": {}", err),
34 SwishClientError::ErrorCollection(ref err) => write!(
35 f,
36 ": {}",
37 err.iter()
38 .fold(String::new(), |acc, curr| acc + &curr.to_string() + ", ")
39 ),
40 }
41 }
42}
43
44impl From<RequestError> for SwishClientError {
45 fn from(error: RequestError) -> SwishClientError {
46 SwishClientError::Swish(error)
47 }
48}
49
50impl From<ErrorCollection> for SwishClientError {
51 fn from(error: ErrorCollection) -> SwishClientError {
52 SwishClientError::ErrorCollection(error)
53 }
54}
55
56impl From<hyper::Error> for SwishClientError {
57 fn from(err: hyper::Error) -> SwishClientError {
58 SwishClientError::Http(err)
59 }
60}
61
62impl From<uri::InvalidUri> for SwishClientError {
63 fn from(err: uri::InvalidUri) -> SwishClientError {
64 SwishClientError::Uri(err)
65 }
66}
67
68impl From<io::Error> for SwishClientError {
69 fn from(err: io::Error) -> SwishClientError {
70 SwishClientError::Io(err)
71 }
72}
73
74impl From<serde_json::Error> for SwishClientError {
75 fn from(err: serde_json::Error) -> SwishClientError {
76 SwishClientError::Json(err)
77 }
78}
79
80#[derive(Debug, Deserialize, Clone)]
81pub enum ErrorCode {
82 FF08,
84 RP03,
86 BE18,
88 RP01,
90 PA02,
92 AM06,
94 AM02,
96 AM03,
98 RP02,
100 RP06,
102 ACMT03,
104 ACMT01,
106 ACMT07,
108 PA01,
110 RF02,
112}
113
114#[derive(Debug, Default, Deserialize, Clone)]
115pub struct RequestError {
116 #[serde(skip_deserializing)]
117 pub http_status: hyper::StatusCode,
118
119 #[serde(rename = "errorCode")]
120 pub code: Option<ErrorCode>,
121
122 #[serde(rename = "errorMessage")]
123 pub message: String,
124
125 #[serde(rename = "additionalInformation")]
126 pub additional_information: Option<String>,
127}
128
129impl fmt::Display for RequestError {
130 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
131 write!(f, "{}", self.http_status)
132 }
133}