use std::io::Error as IoError;
use std::str::Utf8Error;
use std::sync::mpsc::SendError;
use serde_json::error::Error as JsonError;
use protobuf::ProtobufError;
use serde_json::Value;
#[derive(Debug, Error)]
pub enum Error {
#[error(msg_embedded, non_std, no_from)]
Compile(String),
Runtime(RuntimeError),
Driver(DriverError),
}
#[derive(Debug, Error)]
pub enum RuntimeError {
#[error(msg_embedded, non_std, no_from)]
QueryLogic(String),
#[error(msg_embedded, non_std, no_from)]
NonExistence(String),
#[error(msg_embedded, non_std, no_from)]
ResourceLimit(String),
#[error(msg_embedded, non_std, no_from)]
User(String),
#[error(msg_embedded, non_std, no_from)]
Internal(String),
#[error(msg_embedded, non_std, no_from)]
Timeout(String),
Availability(AvailabilityError),
#[error(msg_embedded, non_std, no_from)]
Permission(String),
}
#[derive(Debug, Error)]
pub enum AvailabilityError {
#[error(msg_embedded, non_std, no_from)]
OpFailed(String),
#[error(msg_embedded, non_std, no_from)]
OpIndeterminate(String),
}
#[derive(Debug, Error)]
pub enum DriverError {
#[error(msg_embedded, non_std, no_from)]
Auth(String),
Io(IoError),
Response(ResponseError),
Json(JsonError),
Protobuf(ProtobufError),
#[error(msg_embedded, non_std, no_from)]
Other(String),
}
#[derive(Debug, Error)]
pub enum ResponseError {
Parse(Utf8Error),
#[error(non_std, no_from)]
Db(Value),
}
impl From<ResponseError> for Error {
fn from(err: ResponseError) -> Error {
From::from(DriverError::Response(err))
}
}
impl From<AvailabilityError> for Error {
fn from(err: AvailabilityError) -> Error {
From::from(RuntimeError::Availability(err))
}
}
impl From<IoError> for Error {
fn from(err: IoError) -> Error {
From::from(DriverError::Io(err))
}
}
impl From<Utf8Error> for Error {
fn from(err: Utf8Error) -> Error {
From::from(ResponseError::Parse(err))
}
}
impl From<JsonError> for Error {
fn from(err: JsonError) -> Error {
From::from(DriverError::Json(err))
}
}
impl From<ProtobufError> for Error {
fn from(err: ProtobufError) -> Error {
From::from(DriverError::Protobuf(err))
}
}
impl<T> From<SendError<T>> for Error {
fn from(err: SendError<T>) -> Error {
let msg = format!("{:?}", err);
From::from(DriverError::Other(msg))
}
}