transact/state/merkle/kv/
error.rs1use std::error::Error;
18use std::fmt;
19
20use crate::error::InternalError;
21use crate::protos::ProtoConversionError;
22use cbor::decoder::DecodeError;
23use cbor::encoder::EncodeError;
24use protobuf::ProtobufError;
25
26use crate::database::error::DatabaseError;
27
28#[derive(Debug)]
29pub enum StateDatabaseError {
30 NotFound(String),
31 DeserializationError(DecodeError),
32 SerializationError(EncodeError),
33 ChangeLogEncodingError(String),
34 InternalError(InternalError),
35 InvalidRecord,
36 InvalidHash(String),
37 InvalidChangeLogIndex(String),
38 DatabaseError(DatabaseError),
39 ProtobufConversionError(ProtoConversionError),
40 UnknownError,
41}
42
43impl fmt::Display for StateDatabaseError {
44 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
45 match *self {
46 StateDatabaseError::NotFound(ref msg) => write!(f, "Value not found: {}", msg),
47 StateDatabaseError::DeserializationError(ref err) => {
48 write!(f, "Unable to deserialize entry: {}", err)
49 }
50 StateDatabaseError::SerializationError(ref err) => {
51 write!(f, "Unable to serialize entry: {}", err)
52 }
53 StateDatabaseError::ChangeLogEncodingError(ref msg) => {
54 write!(f, "Unable to serialize change log entry: {}", msg)
55 }
56 StateDatabaseError::InternalError(ref err) => f.write_str(&err.to_string()),
57 StateDatabaseError::InvalidRecord => write!(f, "A node was malformed"),
58 StateDatabaseError::InvalidHash(ref msg) => {
59 write!(f, "The given hash is invalid: {}", msg)
60 }
61 StateDatabaseError::InvalidChangeLogIndex(ref msg) => {
62 write!(f, "A change log entry was missing or malformed: {}", msg)
63 }
64 StateDatabaseError::DatabaseError(ref err) => {
65 write!(f, "A database error occurred: {}", err)
66 }
67 StateDatabaseError::ProtobufConversionError(ref err) => {
68 write!(f, "A protobuf conversion error occurred: {}", err)
69 }
70 StateDatabaseError::UnknownError => write!(f, "An unknown error occurred"),
71 }
72 }
73}
74
75impl Error for StateDatabaseError {
76 fn source(&self) -> Option<&(dyn Error + 'static)> {
77 match *self {
78 StateDatabaseError::NotFound(_) => None,
79 StateDatabaseError::DeserializationError(ref err) => Some(err),
80 StateDatabaseError::SerializationError(ref err) => Some(err),
81 StateDatabaseError::ChangeLogEncodingError(_) => None,
82 StateDatabaseError::InternalError(ref err) => Some(err),
83 StateDatabaseError::InvalidRecord => None,
84 StateDatabaseError::InvalidHash(_) => None,
85 StateDatabaseError::InvalidChangeLogIndex(_) => None,
86 StateDatabaseError::DatabaseError(ref err) => Some(err),
87 StateDatabaseError::ProtobufConversionError(ref err) => Some(err),
88 StateDatabaseError::UnknownError => None,
89 }
90 }
91}
92
93impl From<DatabaseError> for StateDatabaseError {
94 fn from(err: DatabaseError) -> Self {
95 StateDatabaseError::DatabaseError(err)
96 }
97}
98
99impl From<EncodeError> for StateDatabaseError {
100 fn from(err: EncodeError) -> Self {
101 StateDatabaseError::SerializationError(err)
102 }
103}
104
105impl From<DecodeError> for StateDatabaseError {
106 fn from(err: DecodeError) -> Self {
107 StateDatabaseError::DeserializationError(err)
108 }
109}
110
111impl From<ProtobufError> for StateDatabaseError {
112 fn from(error: ProtobufError) -> Self {
113 use self::ProtobufError::*;
114 match error {
115 IoError(err) => StateDatabaseError::ChangeLogEncodingError(format!("{}", err)),
116 WireError(err) => StateDatabaseError::ChangeLogEncodingError(format!("{:?}", err)),
117 Utf8(err) => StateDatabaseError::ChangeLogEncodingError(format!("{}", err)),
118 MessageNotInitialized { message: err } => {
119 StateDatabaseError::ChangeLogEncodingError(err.to_string())
120 }
121 }
122 }
123}
124
125impl From<ProtoConversionError> for StateDatabaseError {
126 fn from(err: ProtoConversionError) -> Self {
127 StateDatabaseError::ProtobufConversionError(err)
128 }
129}
130
131impl From<InternalError> for StateDatabaseError {
132 fn from(err: InternalError) -> Self {
133 StateDatabaseError::InternalError(err)
134 }
135}