newsblur_api/
error.rs

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}