use std::fmt;
#[derive(Debug, Clone)]
pub enum EvalError {
ArithmeticTrap(String),
AssertionFailed(String),
InvariantViolation(String),
NilAccess(String),
UnwrapError(String),
UndefinedVariable(String),
UndefinedAction(String),
TypeMismatch(String),
StdlibError(String),
UnknownFunction(String),
GasExhausted,
Return(pepl_stdlib::Value),
Runtime(String),
}
impl fmt::Display for EvalError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::ArithmeticTrap(msg) => write!(f, "arithmetic trap: {msg}"),
Self::AssertionFailed(msg) => write!(f, "assertion failed: {msg}"),
Self::InvariantViolation(msg) => write!(f, "invariant violation: {msg}"),
Self::NilAccess(msg) => write!(f, "nil access: {msg}"),
Self::UnwrapError(msg) => write!(f, "unwrap error: {msg}"),
Self::UndefinedVariable(name) => write!(f, "undefined variable: {name}"),
Self::UndefinedAction(name) => write!(f, "undefined action: {name}"),
Self::TypeMismatch(msg) => write!(f, "type mismatch: {msg}"),
Self::StdlibError(msg) => write!(f, "stdlib error: {msg}"),
Self::UnknownFunction(msg) => write!(f, "unknown function: {msg}"),
Self::GasExhausted => write!(f, "gas exhausted"),
Self::Return(_) => write!(f, "return"),
Self::Runtime(msg) => write!(f, "runtime error: {msg}"),
}
}
}
impl std::error::Error for EvalError {}
pub type EvalResult<T> = Result<T, EvalError>;