use thiserror::Error;
#[derive(Debug, Error)]
pub enum WasmError {
#[error("failed to create WASM engine: {0}")]
EngineCreation(String),
#[error("failed to compile WASM module: {0}")]
Compilation(String),
#[error("failed to instantiate WASM module: {0}")]
Instantiation(String),
#[error("WASM execution trapped: {0}")]
Trap(String),
#[error("WASM execution timed out after {0}ms")]
Timeout(u64),
#[error("WASM memory limit exceeded: requested {requested} bytes, limit {limit} bytes")]
MemoryLimitExceeded { requested: usize, limit: usize },
#[error("missing required WASM export: {0}")]
MissingExport(String),
#[error("invalid export signature for '{name}': expected {expected}, got {actual}")]
InvalidExportSignature {
name: String,
expected: String,
actual: String,
},
#[error("plugin imports undeclared host function: {0}")]
UndeclaredImport(String),
#[error("unknown capability: {0}")]
UnknownCapability(String),
#[error("failed to parse plugin manifest: {0}")]
ManifestParse(String),
#[error("invalid plugin manifest: {0}")]
ManifestValidation(String),
#[error("failed to parse config schema: {0}")]
SchemaParse(String),
#[error("config validation failed: {0}")]
ConfigValidation(String),
#[error("plugin initialization failed: {0}")]
InitFailed(String),
#[error("invalid return code from plugin: {0}")]
InvalidReturnCode(i32),
#[error("serialization error: {0}")]
Serialization(String),
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
}
impl From<wasmtime::Error> for WasmError {
fn from(err: wasmtime::Error) -> Self {
WasmError::Compilation(err.to_string())
}
}
impl From<serde_json::Error> for WasmError {
fn from(err: serde_json::Error) -> Self {
WasmError::Serialization(err.to_string())
}
}
impl From<toml::de::Error> for WasmError {
fn from(err: toml::de::Error) -> Self {
WasmError::ManifestParse(err.to_string())
}
}