near_vm_compiler/
error.rs1use crate::lib::std::string::String;
2
3#[derive(Debug, thiserror::Error)]
12pub enum CompileError {
13 #[error("WebAssembly translation error: {0}")]
15 Wasm(WasmError),
16
17 #[error("Compilation error: {0}")]
19 Codegen(String),
20
21 #[error("Validation error: {0}")]
23 Validate(String),
24
25 #[error("Finite-wasm analysis error: {0}")]
27 Analyze(finite_wasm::Error),
28
29 #[error("Feature {0} is not yet supported")]
31 UnsupportedFeature(String),
32
33 #[error(
36 "The target {0} is not yet supported (see https://docs.wasmer.io/ecosystem/wasmer/wasmer-features)"
37 )]
38 UnsupportedTarget(String),
39
40 #[error("Insufficient resources: {0}")]
42 Resource(String),
43
44 #[error("data offset is out of bounds")]
46 InvalidOffset,
47}
48
49impl From<WasmError> for CompileError {
50 fn from(original: WasmError) -> Self {
51 Self::Wasm(original)
52 }
53}
54
55#[derive(Debug, thiserror::Error)]
57#[error("Error in middleware {name}: {message}")]
58pub struct MiddlewareError {
59 pub name: String,
61 pub message: String,
63}
64
65impl MiddlewareError {
66 pub fn new<A: Into<String>, B: Into<String>>(name: A, message: B) -> Self {
68 Self { name: name.into(), message: message.into() }
69 }
70}
71
72#[derive(Debug, thiserror::Error)]
77pub enum WasmError {
78 #[error("Invalid input WebAssembly code at offset {offset}: {message}")]
83 InvalidWebAssembly {
84 message: String,
86 offset: usize,
88 },
89
90 #[error("Unsupported feature: {0}")]
94 Unsupported(String),
95
96 #[error("Implementation limit exceeded")]
98 ImplLimitExceeded,
99
100 #[error("{0}")]
102 Middleware(MiddlewareError),
103
104 #[error("{0}")]
106 Generic(String),
107}
108
109impl From<MiddlewareError> for WasmError {
110 fn from(original: MiddlewareError) -> Self {
111 Self::Middleware(original)
112 }
113}
114
115#[derive(Debug, thiserror::Error)]
118pub enum ParseCpuFeatureError {
119 #[error("CpuFeature {0} not recognized")]
121 Missing(String),
122}
123
124pub type WasmResult<T> = Result<T, WasmError>;
126
127#[cfg(test)]
128mod tests {
129 use super::*;
130
131 #[test]
132 fn middleware_error_can_be_created() {
133 let msg = String::from("Something went wrong");
134 let error = MiddlewareError::new("manipulator3000", msg);
135 assert_eq!(error.name, "manipulator3000");
136 assert_eq!(error.message, "Something went wrong");
137 }
138
139 #[test]
140 fn middleware_error_be_converted_to_wasm_error() {
141 let error = WasmError::from(MiddlewareError::new("manipulator3000", "foo"));
142 match error {
143 WasmError::Middleware(MiddlewareError { name, message }) => {
144 assert_eq!(name, "manipulator3000");
145 assert_eq!(message, "foo");
146 }
147 err => panic!("Unexpected error: {:?}", err),
148 }
149 }
150}