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
use std::fmt::Display;
use locutus_stdlib::prelude::{ComponentKey, ContractKey};
use crate::{component, runtime, secrets_store};
pub type RuntimeResult<T> = std::result::Result<T, ContractError>;
#[derive(Debug)]
pub struct ContractError(Box<RuntimeInnerError>);
impl ContractError {
pub fn is_contract_exec_error(&self) -> bool {
matches!(&*self.0, RuntimeInnerError::ContractExecError(_))
}
pub fn is_component_exec_error(&self) -> bool {
matches!(&*self.0, RuntimeInnerError::ComponentExecError(_))
}
}
impl Display for ContractError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.0.fmt(f)
}
}
impl std::error::Error for ContractError {}
impl From<RuntimeInnerError> for ContractError {
fn from(err: RuntimeInnerError) -> Self {
Self(Box::new(err))
}
}
macro_rules! impl_err {
($type:ty) => {
impl From<$type> for ContractError {
fn from(err: $type) -> Self {
Self(Box::new(RuntimeInnerError::from(err)))
}
}
};
}
impl_err!(Box<dyn std::error::Error + Send + Sync>);
impl_err!(locutus_stdlib::buf::Error);
impl_err!(std::io::Error);
impl_err!(secrets_store::SecretStoreError);
impl_err!(bincode::Error);
impl_err!(component::ComponentExecError);
impl_err!(runtime::ContractExecError);
#[cfg(test)]
impl_err!(wasmer_wasi::WasiStateCreationError);
#[cfg(test)]
impl_err!(wasmer_wasi::WasiError);
impl_err!(wasmer::CompileError);
impl_err!(wasmer::ExportError);
impl_err!(wasmer::InstantiationError);
impl_err!(wasmer::MemoryError);
impl_err!(wasmer::RuntimeError);
#[derive(thiserror::Error, Debug)]
pub(crate) enum RuntimeInnerError {
#[error(transparent)]
Any(#[from] Box<dyn std::error::Error + Send + Sync>),
#[error(transparent)]
BufferError(#[from] locutus_stdlib::buf::Error),
#[error(transparent)]
IOError(#[from] std::io::Error),
#[error(transparent)]
SecretStoreError(#[from] secrets_store::SecretStoreError),
#[error(transparent)]
Serialization(#[from] bincode::Error),
#[error("component {0} not found in store")]
ComponentNotFound(ComponentKey),
#[error(transparent)]
ComponentExecError(#[from] component::ComponentExecError),
#[error("contract {0} not found in store")]
ContractNotFound(ContractKey),
#[error(transparent)]
ContractExecError(#[from] runtime::ContractExecError),
#[error("failed while unwrapping contract to raw bytes")]
UnwrapContract,
#[cfg(test)]
#[error(transparent)]
WasiEnvError(#[from] wasmer_wasi::WasiStateCreationError),
#[cfg(test)]
#[error(transparent)]
WasiError(#[from] wasmer_wasi::WasiError),
#[error(transparent)]
WasmCompileError(#[from] wasmer::CompileError),
#[error(transparent)]
WasmExportError(#[from] wasmer::ExportError),
#[error(transparent)]
WasmInstantiationError(#[from] wasmer::InstantiationError),
#[error(transparent)]
WasmMemError(#[from] wasmer::MemoryError),
#[error(transparent)]
WasmRtError(#[from] wasmer::RuntimeError),
}