1use failure::{Backtrace, Context, Fail};
2use std::fmt;
3
4#[derive(Debug)]
5pub struct ApiError {
6 inner: Context<ApiErrorKind>,
7}
8
9#[derive(Clone, Eq, PartialEq, Debug, Fail)]
10pub enum ApiErrorKind {
11 #[fail(display = "Url Error")]
12 Url,
13 #[fail(display = "Json Error")]
14 Json,
15 #[fail(display = "Http request failed")]
16 Http,
17 #[fail(display = "Malformed input arguments")]
18 Input,
19 #[fail(display = "IO Error")]
20 IO,
21 #[fail(display = "No valid access token available")]
22 Token,
23 #[fail(display = "Request failed with message access denied")]
24 AccessDenied,
25 #[fail(display = "Internal error")]
26 InternalMutabilty,
27 #[fail(display = "Access token expired")]
28 TokenExpired,
29 #[fail(display = "Error parsing string (enum/date) returned by GReader")]
30 Parse,
31 #[fail(display = "Unknown error")]
32 Unknown,
33}
34
35impl Fail for ApiError {
36 fn cause(&self) -> Option<&dyn Fail> {
37 self.inner.cause()
38 }
39
40 fn backtrace(&self) -> Option<&Backtrace> {
41 self.inner.backtrace()
42 }
43}
44
45impl fmt::Display for ApiError {
46 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
47 fmt::Display::fmt(&self.inner, f)
48 }
49}
50
51impl ApiError {
52 pub fn kind(&self) -> ApiErrorKind {
53 self.inner.get_context().clone()
54 }
55}
56
57impl From<ApiErrorKind> for ApiError {
58 fn from(kind: ApiErrorKind) -> ApiError {
59 ApiError {
60 inner: Context::new(kind),
61 }
62 }
63}
64
65impl From<Context<ApiErrorKind>> for ApiError {
66 fn from(inner: Context<ApiErrorKind>) -> ApiError {
67 ApiError { inner }
68 }
69}