1use crate::lib::std::string::String;
2#[cfg(feature = "std")]
3use thiserror::Error;
4
5#[derive(Debug)]
17#[cfg_attr(feature = "std", derive(Error))]
18pub enum CompileError {
19 #[cfg_attr(feature = "std", error("WebAssembly translation error: {0}"))]
21 Wasm(WasmError),
22
23 #[cfg_attr(feature = "std", error("Compilation error: {0}"))]
25 Codegen(String),
26
27 #[cfg_attr(feature = "std", error("Validation error: {0}"))]
29 Validate(String),
30
31 #[cfg_attr(feature = "std", error("Feature {0} is not yet supported"))]
33 UnsupportedFeature(String),
34
35 #[cfg_attr(feature = "std", error("The target {0} is not yet supported (see https://docs.wasmer.io/ecosystem/wasmer/wasmer-features)"))]
38 UnsupportedTarget(String),
39
40 #[cfg_attr(feature = "std", error("Insufficient resources: {0}"))]
42 Resource(String),
43
44 #[cfg_attr(
46 feature = "std",
47 error("cannot downcast the engine to a specific type")
48 )]
49 EngineDowncast,
50}
51
52impl From<WasmError> for CompileError {
53 fn from(original: WasmError) -> Self {
54 Self::Wasm(original)
55 }
56}
57
58#[derive(Debug)]
60#[cfg_attr(feature = "std", derive(Error))]
61#[cfg_attr(feature = "std", error("Error in middleware {name}: {message}"))]
62pub struct MiddlewareError {
63 pub name: String,
65 pub message: String,
67}
68
69impl MiddlewareError {
70 pub fn new<A: Into<String>, B: Into<String>>(name: A, message: B) -> Self {
72 Self {
73 name: name.into(),
74 message: message.into(),
75 }
76 }
77}
78
79#[derive(Debug)]
84#[cfg_attr(feature = "std", derive(Error))]
85pub enum WasmError {
86 #[cfg_attr(
91 feature = "std",
92 error("Invalid input WebAssembly code at offset {offset}: {message}")
93 )]
94 InvalidWebAssembly {
95 message: String,
97 offset: usize,
99 },
100
101 #[cfg_attr(feature = "std", error("Unsupported feature: {0}"))]
105 Unsupported(String),
106
107 #[cfg_attr(feature = "std", error("Implementation limit exceeded"))]
109 ImplLimitExceeded,
110
111 #[cfg_attr(feature = "std", error("{0}"))]
113 Middleware(MiddlewareError),
114
115 #[cfg_attr(feature = "std", error("{0}"))]
117 Generic(String),
118}
119
120impl From<MiddlewareError> for WasmError {
121 fn from(original: MiddlewareError) -> Self {
122 Self::Middleware(original)
123 }
124}
125
126#[derive(Debug)]
129#[cfg_attr(feature = "std", derive(Error))]
130pub enum ParseCpuFeatureError {
131 #[cfg_attr(feature = "std", error("CpuFeature {0} not recognized"))]
133 Missing(String),
134}
135
136pub type WasmResult<T> = Result<T, WasmError>;
138
139#[cfg(test)]
140mod tests {
141 use super::*;
142
143 #[test]
144 fn middleware_error_can_be_created() {
145 let msg = String::from("Something went wrong");
146 let error = MiddlewareError::new("manipulator3000", msg);
147 assert_eq!(error.name, "manipulator3000");
148 assert_eq!(error.message, "Something went wrong");
149 }
150
151 #[test]
152 fn middleware_error_be_converted_to_wasm_error() {
153 let error = WasmError::from(MiddlewareError::new("manipulator3000", "foo"));
154 match error {
155 WasmError::Middleware(MiddlewareError { name, message }) => {
156 assert_eq!(name, "manipulator3000");
157 assert_eq!(message, "foo");
158 }
159 err => panic!("Unexpected error: {:?}", err),
160 }
161 }
162}