transact/state/merkle/kv/
error.rs

1/*
2 * Copyright 2018 Intel Corporation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 * ------------------------------------------------------------------------------
16 */
17use 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}