1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
use super::{register::User, RegisterAddress};
use crate::messaging::data::Error as ErrorMessage;
use std::{
collections::BTreeMap,
fmt::{self, Debug, Formatter},
result,
};
use thiserror::Error;
pub type Result<T> = result::Result<T, Error>;
struct ErrorDebug<'a, T>(&'a Result<T>);
impl<'a, T> Debug for ErrorDebug<'a, T> {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
if let Err(error) = self.0 {
write!(f, "{:?}", error)
} else {
write!(f, "Success")
}
}
}
#[derive(Error, Debug, Clone, PartialEq)]
#[non_exhaustive]
#[allow(clippy::large_enum_variant)]
pub enum Error {
#[error("Access denied for user: {0:?}")]
AccessDenied(User),
#[error("Serialisation error: {0}")]
Serialisation(String),
#[error("File Creation error: {0}")]
FileHandling(String),
#[error("Directory Creation error: {0}")]
DirectoryHandling(String),
#[error("Entry already exists {0}")]
EntryExists(u8),
#[error("Entry is too big to fit inside a register: {0}, max: {1}")]
EntryTooBig(usize, usize),
#[error("Cannot add another entry since the register entry cap has been reached: {0}")]
TooManyEntries(usize),
#[error("Some entry actions are not valid")]
InvalidEntryActions(BTreeMap<Vec<u8>, Error>),
#[error("Requested entry not found")]
NoSuchEntry,
#[error("Key does not exist")]
NoSuchKey,
#[error("Owner is not a PublicKeySet")]
InvalidOwnerNotPublicKeySet,
#[error("No policy has been set for this data")]
PolicyNotSet,
#[error("Invalid version provided: {0}")]
InvalidSuccessor(u64),
#[error("Operation is not causally ready. Ensure you have the full history of operations.")]
OpNotCausallyReady,
#[error("Invalid operation")]
InvalidOperation,
#[error("Sign key and signature type do not match")]
SigningKeyTypeMismatch,
#[error("Invalid signature")]
InvalidSignature,
#[error("Lost precision on the number of coins during parsing")]
LossOfPrecision,
#[error("The token amount would exceed the maximum value (u64::MAX)")]
ExcessiveValue,
#[error("Failed to parse: {0}")]
FailedToParse(String),
#[error("No such recipient key balance")]
NoSuchRecipient,
#[error("Size of the structure exceeds the limit")]
ExceededSize,
#[error("The provided number is out of the expected range")]
OutOfRange,
#[error("CRDT operation missing actor signature")]
CrdtMissingOpSignature,
#[error("CRDT data is in an unexpected and/or inconsistent state. No data found for current policy.")]
CrdtUnexpectedState,
#[error("The CRDT operation cannot be applied as it targets a different content address.")]
CrdtWrongAddress(RegisterAddress),
}
pub(crate) fn convert_bincode_error(err: bincode::Error) -> Error {
Error::Serialisation(err.as_ref().to_string())
}
pub fn convert_dt_error_to_error_message(error: Error) -> ErrorMessage {
match error {
Error::InvalidOperation => {
ErrorMessage::InvalidOperation("DtError::InvalidOperation".to_string())
}
Error::NoSuchEntry => ErrorMessage::NoSuchEntry,
Error::AccessDenied(pk) => ErrorMessage::AccessDenied(pk),
other => ErrorMessage::InvalidOperation(format!("DtError: {:?}", other)),
}
}