use std::fmt;
use std::io;
use reqwest;
use serde::Deserialize;
use serde_json;
use url;
pub type Result<T, E = Error> = std::result::Result<T, E>;
#[derive(Deserialize)]
pub struct Error {
detail: String,
#[serde(skip_deserializing)]
value: ErrValue,
}
impl Error {
pub fn detail(&self) -> String {
self.detail.to_string()
}
pub fn with_value(val: ErrValue) -> Error {
Error {
detail: val.to_string(),
value: val,
}
}
pub fn value(self) -> ErrValue {
self.value
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Uploadcare: {}", self.value)
}
}
impl fmt::Debug for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Error: {}", self.value)
}
}
impl From<io::Error> for Error {
fn from(err: io::Error) -> Self {
Error {
detail: err.to_string(),
value: ErrValue::InputOutput(err),
}
}
}
impl From<reqwest::Error> for Error {
fn from(err: reqwest::Error) -> Self {
Error {
detail: err.to_string(),
value: ErrValue::Reqwest(err),
}
}
}
impl From<serde_json::Error> for Error {
fn from(err: serde_json::Error) -> Self {
Error {
detail: err.to_string(),
value: ErrValue::SerdeJson(err),
}
}
}
impl From<url::ParseError> for Error {
fn from(err: url::ParseError) -> Self {
Error {
detail: err.to_string(),
value: ErrValue::ParseUrl(err),
}
}
}
pub enum ErrValue {
BadRequest(String),
Unauthorized(String),
Forbidden(String),
NotFound(String),
NotAcceptable(String),
PayloadTooLarge(String),
TooManyRequests(i32),
Reqwest(reqwest::Error),
InputOutput(io::Error),
SerdeJson(serde_json::Error),
ParseUrl(url::ParseError),
Other(String),
}
impl fmt::Display for ErrValue {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let prefix = "Uploadcare";
match *self {
ErrValue::BadRequest(ref msg) => write!(f, "{}: {}", prefix, msg),
ErrValue::Unauthorized(ref msg) => write!(f, "{}: {}", prefix, msg),
ErrValue::Forbidden(ref msg) => write!(f, "{}: {}", prefix, msg),
ErrValue::NotFound(ref msg) => write!(f, "{}: {}", prefix, msg),
ErrValue::NotAcceptable(ref msg) => write!(f, "{}: {}", prefix, msg),
ErrValue::PayloadTooLarge(ref msg) => write!(f, "{}: {}", prefix, msg),
ErrValue::TooManyRequests(ref retry_after) => write!(
f,
"{}: too many requests, retry after {}",
prefix, retry_after
),
ErrValue::Reqwest(ref err) => write!(f, "{}: {}", prefix, err),
ErrValue::InputOutput(ref err) => write!(f, "{}: {}", prefix, err),
ErrValue::SerdeJson(ref err) => write!(f, "{}: {}", prefix, err),
ErrValue::ParseUrl(ref err) => write!(f, "{}: {}", prefix, err),
ErrValue::Other(ref msg) => write!(f, "{}: {}", prefix, msg),
}
}
}
impl Default for ErrValue {
fn default() -> Self {
ErrValue::Other("ErrValue".to_string())
}
}