use sp_serializer;
use wasmi;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug, derive_more::Display, derive_more::From)]
pub enum Error {
InvalidData(sp_serializer::Error),
Trap(wasmi::Trap),
Wasmi(wasmi::Error),
#[from(ignore)]
ApiError(String),
#[display(fmt="Method not found: '{}'", _0)]
#[from(ignore)]
MethodNotFound(String),
#[display(fmt="Invalid Code: {}", _0)]
#[from(ignore)]
InvalidCode(String),
#[display(fmt="On-chain runtime does not specify version")]
VersionInvalid,
#[display(fmt="Externalities error")]
Externalities,
#[display(fmt="Invalid index provided")]
InvalidIndex,
#[display(fmt="Invalid type returned (should be u64)")]
InvalidReturn,
#[display(fmt="Runtime error")]
Runtime,
#[display(fmt="Runtime panicked: {}", _0)]
#[from(ignore)]
RuntimePanicked(String),
#[display(fmt="Invalid memory reference")]
InvalidMemoryReference,
#[display(fmt="The runtime doesn't provide a global named `__heap_base`")]
HeapBaseNotFoundOrInvalid,
#[display(fmt="The runtime has the `start` function")]
RuntimeHasStartFn,
Other(String),
#[display(fmt="Error in allocator: {}", _0)]
Allocator(sp_allocator::Error),
#[display(fmt="Host function {} execution failed with: {}", _0, _1)]
FunctionExecution(String, String),
}
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Error::InvalidData(ref err) => Some(err),
Error::Trap(ref err) => Some(err),
Error::Wasmi(ref err) => Some(err),
_ => None,
}
}
}
impl wasmi::HostError for Error {}
impl From<&'static str> for Error {
fn from(err: &'static str) -> Error {
Error::Other(err.into())
}
}
impl From<WasmError> for Error {
fn from(err: WasmError) -> Error {
Error::Other(err.to_string())
}
}
#[derive(Debug, derive_more::Display)]
pub enum WasmError {
CodeNotFound,
ApplySnapshotFailed,
ErasingFailed(String),
InvalidModule,
CantDeserializeWasm,
InvalidMemory,
InvalidHeapPages,
Instantiation(String),
Other(String),
}