use std::error::Error;
use std::fmt;
use crate::error::InternalError;
use crate::protos::ProtoConversionError;
use cbor::decoder::DecodeError;
use cbor::encoder::EncodeError;
use protobuf::ProtobufError;
use crate::database::error::DatabaseError;
#[derive(Debug)]
pub enum StateDatabaseError {
NotFound(String),
DeserializationError(DecodeError),
SerializationError(EncodeError),
ChangeLogEncodingError(String),
InternalError(InternalError),
InvalidRecord,
InvalidHash(String),
InvalidChangeLogIndex(String),
DatabaseError(DatabaseError),
ProtobufConversionError(ProtoConversionError),
UnknownError,
}
impl fmt::Display for StateDatabaseError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
StateDatabaseError::NotFound(ref msg) => write!(f, "Value not found: {}", msg),
StateDatabaseError::DeserializationError(ref err) => {
write!(f, "Unable to deserialize entry: {}", err)
}
StateDatabaseError::SerializationError(ref err) => {
write!(f, "Unable to serialize entry: {}", err)
}
StateDatabaseError::ChangeLogEncodingError(ref msg) => {
write!(f, "Unable to serialize change log entry: {}", msg)
}
StateDatabaseError::InternalError(ref err) => f.write_str(&err.to_string()),
StateDatabaseError::InvalidRecord => write!(f, "A node was malformed"),
StateDatabaseError::InvalidHash(ref msg) => {
write!(f, "The given hash is invalid: {}", msg)
}
StateDatabaseError::InvalidChangeLogIndex(ref msg) => {
write!(f, "A change log entry was missing or malformed: {}", msg)
}
StateDatabaseError::DatabaseError(ref err) => {
write!(f, "A database error occurred: {}", err)
}
StateDatabaseError::ProtobufConversionError(ref err) => {
write!(f, "A protobuf conversion error occurred: {}", err)
}
StateDatabaseError::UnknownError => write!(f, "An unknown error occurred"),
}
}
}
impl Error for StateDatabaseError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
match *self {
StateDatabaseError::NotFound(_) => None,
StateDatabaseError::DeserializationError(ref err) => Some(err),
StateDatabaseError::SerializationError(ref err) => Some(err),
StateDatabaseError::ChangeLogEncodingError(_) => None,
StateDatabaseError::InternalError(ref err) => Some(err),
StateDatabaseError::InvalidRecord => None,
StateDatabaseError::InvalidHash(_) => None,
StateDatabaseError::InvalidChangeLogIndex(_) => None,
StateDatabaseError::DatabaseError(ref err) => Some(err),
StateDatabaseError::ProtobufConversionError(ref err) => Some(err),
StateDatabaseError::UnknownError => None,
}
}
}
impl From<DatabaseError> for StateDatabaseError {
fn from(err: DatabaseError) -> Self {
StateDatabaseError::DatabaseError(err)
}
}
impl From<EncodeError> for StateDatabaseError {
fn from(err: EncodeError) -> Self {
StateDatabaseError::SerializationError(err)
}
}
impl From<DecodeError> for StateDatabaseError {
fn from(err: DecodeError) -> Self {
StateDatabaseError::DeserializationError(err)
}
}
impl From<ProtobufError> for StateDatabaseError {
fn from(error: ProtobufError) -> Self {
use self::ProtobufError::*;
match error {
IoError(err) => StateDatabaseError::ChangeLogEncodingError(format!("{}", err)),
WireError(err) => StateDatabaseError::ChangeLogEncodingError(format!("{:?}", err)),
Utf8(err) => StateDatabaseError::ChangeLogEncodingError(format!("{}", err)),
MessageNotInitialized { message: err } => {
StateDatabaseError::ChangeLogEncodingError(err.to_string())
}
}
}
}
impl From<ProtoConversionError> for StateDatabaseError {
fn from(err: ProtoConversionError) -> Self {
StateDatabaseError::ProtobufConversionError(err)
}
}
impl From<InternalError> for StateDatabaseError {
fn from(err: InternalError) -> Self {
StateDatabaseError::InternalError(err)
}
}