1use std::fmt;
4
5#[derive(Debug, Clone)]
7pub enum EvalError {
8 ArithmeticTrap(String),
10 AssertionFailed(String),
12 InvariantViolation(String),
14 NilAccess(String),
16 UnwrapError(String),
18 UndefinedVariable(String),
20 UndefinedAction(String),
22 TypeMismatch(String),
24 StdlibError(String),
26 UnknownFunction(String),
28 GasExhausted,
30 Return(pepl_stdlib::Value),
32 Runtime(String),
34}
35
36impl fmt::Display for EvalError {
37 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
38 match self {
39 Self::ArithmeticTrap(msg) => write!(f, "arithmetic trap: {msg}"),
40 Self::AssertionFailed(msg) => write!(f, "assertion failed: {msg}"),
41 Self::InvariantViolation(msg) => write!(f, "invariant violation: {msg}"),
42 Self::NilAccess(msg) => write!(f, "nil access: {msg}"),
43 Self::UnwrapError(msg) => write!(f, "unwrap error: {msg}"),
44 Self::UndefinedVariable(name) => write!(f, "undefined variable: {name}"),
45 Self::UndefinedAction(name) => write!(f, "undefined action: {name}"),
46 Self::TypeMismatch(msg) => write!(f, "type mismatch: {msg}"),
47 Self::StdlibError(msg) => write!(f, "stdlib error: {msg}"),
48 Self::UnknownFunction(msg) => write!(f, "unknown function: {msg}"),
49 Self::GasExhausted => write!(f, "gas exhausted"),
50 Self::Return(_) => write!(f, "return"),
51 Self::Runtime(msg) => write!(f, "runtime error: {msg}"),
52 }
53 }
54}
55
56impl std::error::Error for EvalError {}
57
58pub type EvalResult<T> = Result<T, EvalError>;