use crate::lib::std::string::String;
#[derive(Debug, thiserror::Error)]
pub enum CompileError {
#[error("WebAssembly translation error: {0}")]
Wasm(WasmError),
#[error("Compilation error: {0}")]
Codegen(String),
#[error("Validation error: {0}")]
Validate(String),
#[error("Finite-wasm analysis error: {0}")]
Analyze(finite_wasm::Error),
#[error("Feature {0} is not yet supported")]
UnsupportedFeature(String),
#[error("The target {0} is not yet supported (see https://docs.wasmer.io/ecosystem/wasmer/wasmer-features)")]
UnsupportedTarget(String),
#[error("Insufficient resources: {0}")]
Resource(String),
#[error("data offset is out of bounds")]
InvalidOffset,
}
impl From<WasmError> for CompileError {
fn from(original: WasmError) -> Self {
Self::Wasm(original)
}
}
#[derive(Debug, thiserror::Error)]
#[error("Error in middleware {name}: {message}")]
pub struct MiddlewareError {
pub name: String,
pub message: String,
}
impl MiddlewareError {
pub fn new<A: Into<String>, B: Into<String>>(name: A, message: B) -> Self {
Self { name: name.into(), message: message.into() }
}
}
#[derive(Debug, thiserror::Error)]
pub enum WasmError {
#[error("Invalid input WebAssembly code at offset {offset}: {message}")]
InvalidWebAssembly {
message: String,
offset: usize,
},
#[error("Unsupported feature: {0}")]
Unsupported(String),
#[error("Implementation limit exceeded")]
ImplLimitExceeded,
#[error("{0}")]
Middleware(MiddlewareError),
#[error("{0}")]
Generic(String),
}
impl From<MiddlewareError> for WasmError {
fn from(original: MiddlewareError) -> Self {
Self::Middleware(original)
}
}
#[derive(Debug, thiserror::Error)]
pub enum ParseCpuFeatureError {
#[error("CpuFeature {0} not recognized")]
Missing(String),
}
pub type WasmResult<T> = Result<T, WasmError>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn middleware_error_can_be_created() {
let msg = String::from("Something went wrong");
let error = MiddlewareError::new("manipulator3000", msg);
assert_eq!(error.name, "manipulator3000");
assert_eq!(error.message, "Something went wrong");
}
#[test]
fn middleware_error_be_converted_to_wasm_error() {
let error = WasmError::from(MiddlewareError::new("manipulator3000", "foo"));
match error {
WasmError::Middleware(MiddlewareError { name, message }) => {
assert_eq!(name, "manipulator3000");
assert_eq!(message, "foo");
}
err => panic!("Unexpected error: {:?}", err),
}
}
}