use crate::HostImportError;
use marine_it_interfaces::MITInterfacesError;
use marine_it_parser::ITParserError;
use marine_module_info_parser::ModuleInfoError;
use marine_module_interface::it_interface::ITInterfaceError;
use wasmer_runtime::error as wasmer_error;
use thiserror::Error as ThisError;
#[derive(Debug, ThisError)]
pub enum MError {
#[error("Wasmer resolve error: {0}")]
ResolveError(#[from] wasmer_error::ResolveError),
#[error("Wasmer invoke error: {0}")]
WasmerInvokeError(String),
#[error("Wasmer creation error: {0}")]
WasmerCreationError(#[from] wasmer_error::CreationError),
#[error("Wasmer compile error: {0}")]
WasmerCompileError(#[from] wasmer_error::CompileError),
#[error("Wasmer runtime error: {0}")]
WasmerRuntimeError(String),
#[error("Wasmer link error: {0}")]
WasmerLinkError(#[from] wasmer_error::LinkError),
#[error("Wasmer error: {0}")]
WasmerError(String),
#[error("{0}")]
RecordResolveError(String),
#[error("{0}")]
WASIPrepareError(String),
#[error(transparent)]
ModuleInterfaceError(#[from] ITInterfaceError),
#[error("Execution error: {0}")]
ITInstructionError(#[from] wasmer_it::errors::InstructionError),
#[error("PrepareError: {0}, probably module is malformed")]
PrepareError(#[from] parity_wasm::elements::Error),
#[error("module with name '{0}' already loaded into Marine, please specify another name")]
NonUniqueModuleName(String),
#[error("module with name '{0}' doesn't have function with name {1}")]
NoSuchFunction(String, String),
#[error("module with name '{0}' isn't loaded into Marine")]
NoSuchModule(String),
#[error(transparent)]
HostImportError(#[from] HostImportError),
#[error(transparent)]
WITParseError(#[from] ITParserError),
#[error("{0}")]
IncorrectWIT(String),
#[error(transparent)]
ModuleVersionParseError(#[from] ModuleInfoError),
#[error("module with name '{0}' doesn't contain a version of sdk, probably it's compiled with an old one")]
ModuleWithoutVersion(String),
#[error("module with name '{module_name}' compiled with {provided} sdk version, but at least {required} required")]
IncompatibleSDKVersions {
module_name: String,
required: semver::Version,
provided: semver::Version,
},
#[error("module with name '{module_name}' compiled with {provided} IT version, but at least {required} required")]
IncompatibleITVersions {
module_name: String,
required: semver::Version,
provided: semver::Version,
},
}
impl From<MITInterfacesError> for MError {
fn from(err: MITInterfacesError) -> Self {
MError::IncorrectWIT(format!("{}", err))
}
}
impl From<wasmer_error::RuntimeError> for MError {
fn from(err: wasmer_error::RuntimeError) -> Self {
Self::WasmerRuntimeError(err.to_string())
}
}
impl From<wasmer_error::Error> for MError {
fn from(err: wasmer_error::Error) -> Self {
Self::WasmerError(err.to_string())
}
}
impl From<wasmer_error::InvokeError> for MError {
fn from(err: wasmer_error::InvokeError) -> Self {
Self::WasmerInvokeError(err.to_string())
}
}
impl From<()> for MError {
fn from(_err: ()) -> Self {
MError::IncorrectWIT("failed to parse instructions for adapter type".to_string())
}
}