1use 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("The target {0} is not yet supported (see https://docs.wasmer.io/ecosystem/wasmer/wasmer-features)")]
36 UnsupportedTarget(String),
37
38 #[error("Insufficient resources: {0}")]
40 Resource(String),
41
42 #[error("data offset is out of bounds")]
44 InvalidOffset,
45}
46
47impl From<WasmError> for CompileError {
48 fn from(original: WasmError) -> Self {
49 Self::Wasm(original)
50 }
51}
52
53#[derive(Debug, thiserror::Error)]
55#[error("Error in middleware {name}: {message}")]
56pub struct MiddlewareError {
57 pub name: String,
59 pub message: String,
61}
62
63impl MiddlewareError {
64 pub fn new<A: Into<String>, B: Into<String>>(name: A, message: B) -> Self {
66 Self { name: name.into(), message: message.into() }
67 }
68}
69
70#[derive(Debug, thiserror::Error)]
75pub enum WasmError {
76 #[error("Invalid input WebAssembly code at offset {offset}: {message}")]
81 InvalidWebAssembly {
82 message: String,
84 offset: usize,
86 },
87
88 #[error("Unsupported feature: {0}")]
92 Unsupported(String),
93
94 #[error("Implementation limit exceeded")]
96 ImplLimitExceeded,
97
98 #[error("{0}")]
100 Middleware(MiddlewareError),
101
102 #[error("{0}")]
104 Generic(String),
105}
106
107impl From<MiddlewareError> for WasmError {
108 fn from(original: MiddlewareError) -> Self {
109 Self::Middleware(original)
110 }
111}
112
113#[derive(Debug, thiserror::Error)]
116pub enum ParseCpuFeatureError {
117 #[error("CpuFeature {0} not recognized")]
119 Missing(String),
120}
121
122pub type WasmResult<T> = Result<T, WasmError>;
124
125#[cfg(test)]
126mod tests {
127 use super::*;
128
129 #[test]
130 fn middleware_error_can_be_created() {
131 let msg = String::from("Something went wrong");
132 let error = MiddlewareError::new("manipulator3000", msg);
133 assert_eq!(error.name, "manipulator3000");
134 assert_eq!(error.message, "Something went wrong");
135 }
136
137 #[test]
138 fn middleware_error_be_converted_to_wasm_error() {
139 let error = WasmError::from(MiddlewareError::new("manipulator3000", "foo"));
140 match error {
141 WasmError::Middleware(MiddlewareError { name, message }) => {
142 assert_eq!(name, "manipulator3000");
143 assert_eq!(message, "foo");
144 }
145 err => panic!("Unexpected error: {:?}", err),
146 }
147 }
148}