use crate::Opcode;
use alloc::borrow::Cow;
pub type Trap = Opcode;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Capture<E, T> {
Exit(E),
Trap(T),
}
#[derive(Clone, Debug, Eq, PartialEq)]
#[cfg_attr(
feature = "with-codec",
derive(scale_codec::Encode, scale_codec::Decode, scale_info::TypeInfo)
)]
#[cfg_attr(feature = "with-serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ExitReason {
Succeed(ExitSucceed),
Error(ExitError),
Revert(ExitRevert),
Fatal(ExitFatal),
}
impl ExitReason {
pub fn is_succeed(&self) -> bool {
matches!(self, Self::Succeed(_))
}
pub fn is_error(&self) -> bool {
matches!(self, Self::Error(_))
}
pub fn is_revert(&self) -> bool {
matches!(self, Self::Revert(_))
}
pub fn is_fatal(&self) -> bool {
matches!(self, Self::Fatal(_))
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[cfg_attr(
feature = "with-codec",
derive(scale_codec::Encode, scale_codec::Decode, scale_info::TypeInfo)
)]
#[cfg_attr(feature = "with-serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ExitSucceed {
Stopped,
Returned,
Suicided,
}
impl From<ExitSucceed> for ExitReason {
fn from(s: ExitSucceed) -> Self {
Self::Succeed(s)
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[cfg_attr(
feature = "with-codec",
derive(scale_codec::Encode, scale_codec::Decode, scale_info::TypeInfo)
)]
#[cfg_attr(feature = "with-serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ExitRevert {
Reverted,
}
impl From<ExitRevert> for ExitReason {
fn from(s: ExitRevert) -> Self {
Self::Revert(s)
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
#[cfg_attr(
feature = "with-codec",
derive(scale_codec::Encode, scale_codec::Decode, scale_info::TypeInfo)
)]
#[cfg_attr(feature = "with-serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ExitError {
#[cfg_attr(feature = "with-codec", codec(index = 0))]
StackUnderflow,
#[cfg_attr(feature = "with-codec", codec(index = 1))]
StackOverflow,
#[cfg_attr(feature = "with-codec", codec(index = 2))]
InvalidJump,
#[cfg_attr(feature = "with-codec", codec(index = 3))]
InvalidRange,
#[cfg_attr(feature = "with-codec", codec(index = 4))]
DesignatedInvalid,
#[cfg_attr(feature = "with-codec", codec(index = 5))]
CallTooDeep,
#[cfg_attr(feature = "with-codec", codec(index = 6))]
CreateCollision,
#[cfg_attr(feature = "with-codec", codec(index = 7))]
CreateContractLimit,
#[cfg_attr(feature = "with-codec", codec(index = 15))]
InvalidCode(Opcode),
#[cfg_attr(feature = "with-codec", codec(index = 8))]
OutOfOffset,
#[cfg_attr(feature = "with-codec", codec(index = 9))]
OutOfGas,
#[cfg_attr(feature = "with-codec", codec(index = 10))]
OutOfFund,
#[allow(clippy::upper_case_acronyms)]
#[cfg_attr(feature = "with-codec", codec(index = 11))]
PCUnderflow,
#[cfg_attr(feature = "with-codec", codec(index = 12))]
CreateEmpty,
#[cfg_attr(feature = "with-codec", codec(index = 13))]
Other(Cow<'static, str>),
}
impl From<ExitError> for ExitReason {
fn from(s: ExitError) -> Self {
Self::Error(s)
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
#[cfg_attr(
feature = "with-codec",
derive(scale_codec::Encode, scale_codec::Decode, scale_info::TypeInfo)
)]
#[cfg_attr(feature = "with-serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ExitFatal {
NotSupported,
UnhandledInterrupt,
CallErrorAsFatal(ExitError),
Other(Cow<'static, str>),
}
impl From<ExitFatal> for ExitReason {
fn from(s: ExitFatal) -> Self {
Self::Fatal(s)
}
}