use failure::Fail;
use pyo3::exceptions::PyTypeError;
use pyo3::{import_exception, PyErr, PyObject};
#[derive(Debug, Fail)]
pub enum HyperJsonError {
#[fail(display = "Conversion error: {}", error)]
InvalidConversion { error: serde_json::Error },
#[fail(display = "Python Runtime exception: {}", error)]
PyErr { error: String },
#[fail(display = "Dictionary key is not a string: {:?}", obj)]
DictKeyNotString { obj: PyObject },
#[fail(display = "Invalid float: {}", x)]
InvalidFloat { x: String },
#[fail(display = "Invalid type: {}, Error: {}", t, e)]
InvalidCast { t: String, e: String },
#[fail(display = "Utf8 error: {}", error)]
Utf8Error { error: std::string::FromUtf8Error },
}
impl From<serde_json::Error> for HyperJsonError {
fn from(error: serde_json::Error) -> HyperJsonError {
HyperJsonError::InvalidConversion { error }
}
}
impl From<HyperJsonError> for PyErr {
fn from(h: HyperJsonError) -> PyErr {
match h {
HyperJsonError::InvalidConversion { error } => {
PyErr::new::<PyTypeError, _>(format!("{}", error))
}
HyperJsonError::PyErr { error: _error } => PyErr::new::<PyTypeError, _>("PyErr"),
HyperJsonError::InvalidCast { t: _t, e: _e } => {
PyErr::new::<PyTypeError, _>("InvalidCast")
}
_ => PyErr::new::<PyTypeError, _>("Unknown reason"),
}
}
}
impl From<PyErr> for HyperJsonError {
fn from(error: PyErr) -> HyperJsonError {
HyperJsonError::PyErr {
error: format!("{:?}", error),
}
}
}
import_exception!(json, JSONDecodeError);