1use {std::ops::Range, thiserror::Error};
2
3#[derive(Debug, Error)]
4pub enum SBPFError {
5 #[error("Bytecode error: {error}")]
6 BytecodeError {
7 error: String,
8 span: Range<usize>,
9 custom_label: Option<String>,
10 },
11}
12
13impl SBPFError {
14 pub fn label(&self) -> &str {
15 match self {
16 Self::BytecodeError { custom_label, .. } => {
17 custom_label.as_deref().unwrap_or("Bytecode error")
18 }
19 }
20 }
21
22 pub fn span(&self) -> &Range<usize> {
23 match self {
24 Self::BytecodeError { span, .. } => span,
25 }
26 }
27}
28
29#[cfg(test)]
30mod tests {
31 use super::*;
32
33 #[test]
34 fn test_bytecode_error() {
35 let error = SBPFError::BytecodeError {
36 error: "Invalid opcode".to_string(),
37 span: 10..20,
38 custom_label: Some("Custom error message".to_string()),
39 };
40
41 assert_eq!(error.label(), "Custom error message");
42 assert_eq!(error.span(), &(10..20));
43 assert_eq!(error.to_string(), "Bytecode error: Invalid opcode");
44 }
45}