parent
473205a5f2
commit
3f5c1db430
@ -0,0 +1,88 @@ |
|||||||
|
use std::{ |
||||||
|
io, |
||||||
|
fmt, |
||||||
|
error |
||||||
|
}; |
||||||
|
|
||||||
|
use json::Error as SerdeError; |
||||||
|
use reqwest::Error as HttpError; |
||||||
|
use reqwest::StatusCode; |
||||||
|
use url::ParseError as UrlError; |
||||||
|
|
||||||
|
/// Convience type over `std::result::Result` with `Error` as the error type.
|
||||||
|
pub type Result<T> = ::std::result::Result<T, Error>; |
||||||
|
|
||||||
|
/// enum of possible errors encountered using the mastodon API.
|
||||||
|
#[derive(Debug, Deserialize)] |
||||||
|
#[serde(untagged)] |
||||||
|
pub enum Error { |
||||||
|
/// Error from the Mastodon API. This typically means something went
|
||||||
|
/// wrong with your authentication or data.
|
||||||
|
Api(ApiError), |
||||||
|
/// Error deserialising to json. Typically represents a breaking change in
|
||||||
|
/// the Mastodon API
|
||||||
|
#[serde(skip_deserializing)] |
||||||
|
Serde(SerdeError), |
||||||
|
/// Error encountered in the HTTP backend while requesting a route.
|
||||||
|
#[serde(skip_deserializing)] |
||||||
|
Http(HttpError), |
||||||
|
/// Wrapper around the `std::io::Error` struct.
|
||||||
|
#[serde(skip_deserializing)] |
||||||
|
Io(io::Error), |
||||||
|
/// Wrapper around the `url::ParseError` struct.
|
||||||
|
#[serde(skip_deserializing)] |
||||||
|
Url(UrlError), |
||||||
|
/// Missing Client Id.
|
||||||
|
#[serde(skip_deserializing)] |
||||||
|
ClientIdRequired, |
||||||
|
/// Missing Client Secret.
|
||||||
|
#[serde(skip_deserializing)] |
||||||
|
ClientSecretRequired, |
||||||
|
/// Missing Access Token.
|
||||||
|
#[serde(skip_deserializing)] |
||||||
|
AccessTokenRequired, |
||||||
|
/// Generic client error.
|
||||||
|
#[serde(skip_deserializing)] |
||||||
|
Client(StatusCode), |
||||||
|
/// Generic server error.
|
||||||
|
#[serde(skip_deserializing)] |
||||||
|
Server(StatusCode), |
||||||
|
} |
||||||
|
|
||||||
|
impl fmt::Display for Error { |
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
||||||
|
write!(f, "{:?}", self) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl error::Error for Error { |
||||||
|
fn description(&self) -> &str { |
||||||
|
match *self { |
||||||
|
Error::Api(ref e) => { |
||||||
|
e.error_description.as_ref().map(|i| &**i) |
||||||
|
.or(e.error.as_ref().map(|i| &**i)) |
||||||
|
.unwrap_or("Unknown API Error") |
||||||
|
}, |
||||||
|
Error::Serde(ref e) => e.description(), |
||||||
|
Error::Http(ref e) => e.description(), |
||||||
|
Error::Io(ref e) => e.description(), |
||||||
|
Error::Url(ref e) => e.description(), |
||||||
|
Error::Client(ref status) | Error::Server(ref status) => { |
||||||
|
status.canonical_reason().unwrap_or("Unknown Status code") |
||||||
|
}, |
||||||
|
Error::ClientIdRequired => "ClientIdRequired", |
||||||
|
Error::ClientSecretRequired => "ClientSecretRequired", |
||||||
|
Error::AccessTokenRequired => "AccessTokenRequired", |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/// Error returned from the Mastodon API.
|
||||||
|
#[derive(Clone, Debug, Deserialize)] |
||||||
|
pub struct ApiError { |
||||||
|
/// The type of error.
|
||||||
|
pub error: Option<String>, |
||||||
|
/// The description of the error.
|
||||||
|
pub error_description: Option<String>, |
||||||
|
} |
||||||
|
|
Loading…
Reference in new issue