1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
use super::CatchableError;
use super::Joinable;
use super::LastErrorAffectable;
use super::UncatchableError;
use crate::ToErrorCode;
use strum_macros::EnumDiscriminants;
use strum_macros::EnumIter;
use thiserror::Error as ThisError;
use std::rc::Rc;
#[derive(ThisError, EnumDiscriminants, Debug)]
#[strum_discriminants(derive(EnumIter))]
pub enum ExecutionError {
#[error(transparent)]
Catchable(#[from] Rc<CatchableError>),
#[error(transparent)]
Uncatchable(#[from] UncatchableError),
}
impl ExecutionError {
pub fn is_catchable(&self) -> bool {
matches!(self, ExecutionError::Catchable(_))
}
pub fn is_match_or_mismatch(&self) -> bool {
match self {
ExecutionError::Catchable(catchable) => matches!(
catchable.as_ref(),
CatchableError::MatchValuesNotEqual | CatchableError::MismatchValuesEqual
),
_ => false,
}
}
}
impl From<CatchableError> for ExecutionError {
fn from(catchable: CatchableError) -> Self {
Self::Catchable(std::rc::Rc::new(catchable))
}
}
#[macro_export]
macro_rules! trace_to_exec_err {
($trace_expr: expr, $instruction: ident) => {
$trace_expr.map_err(|trace_error| {
$crate::execution_step::ExecutionError::Uncatchable($crate::execution_step::UncatchableError::TraceError {
trace_error,
instruction: $instruction.to_string(),
})
})
};
}
impl ToErrorCode for ExecutionError {
fn to_error_code(&self) -> i64 {
match self {
ExecutionError::Catchable(err) => err.to_error_code(),
ExecutionError::Uncatchable(err) => err.to_error_code(),
}
}
}
impl Joinable for ExecutionError {
fn is_joinable(&self) -> bool {
match self {
ExecutionError::Catchable(err) => err.is_joinable(),
ExecutionError::Uncatchable(_) => false,
}
}
}
impl LastErrorAffectable for ExecutionError {
fn affects_last_error(&self) -> bool {
match self {
ExecutionError::Catchable(err) => err.affects_last_error(),
ExecutionError::Uncatchable(_) => false,
}
}
}