1
2use pyo3::PyErr;
3use thiserror::Error as E;
4
5use crate::{BinOp, BoolOp, Compare, Expr, ExprType, StatementType, UnaryOp};
6
7#[derive(E, Debug)]
8pub enum Error {
9 #[error("BinOp type not yet implemented: {:?}", .0)]
10 BinOpNotYetImplemented(BinOp),
11
12 #[error("BoolOp type not yet implemented: {:?}", .0)]
13 BoolOpNotYetImplemented(BoolOp),
14
15 #[error("Compare type not yet implemented: {:?}", .0)]
16 CompareNotYetImplemented(Compare),
17
18 #[error("Expr type not yet implemented: {:?}", .0)]
19 ExprNotYetImplemented(Expr),
20 #[error("ExprType type not yet implemented: {:?}", .0)]
21 ExprTypeNotYetImplemented(ExprType),
22
23 #[error("Unknown type {0}")]
24 UnknownType(String),
25
26 #[error("PyO3 Error: {0}")]
27 #[from(PyErr)]
28 Pyo3Error(PyErr),
29
30 #[error("Statement type not yet implemented: {:?}", .0)]
31 StatementNotYetImplemented(StatementType),
32 #[error("UnaryOp type not yet implemented: {:?}", .0)]
33 UnaryOpNotYetImplemented(UnaryOp),
34
35 #[error("Unknown Error: {0}")]
36 #[from(Box<dyn std::error::Error>)]
37 UnknownError(Box<dyn std::error::Error>),
38}
39
40pub type Result<T> = std::result::Result<T, Error>;
41
42#[cfg(test)]
43mod tests {
44 use super::*;
45
46 #[test]
47 fn test_error_display_unknown_type() {
48 let error = Error::UnknownType("SomeUnknownType".to_string());
49 let display = format!("{}", error);
50 assert_eq!(display, "Unknown type SomeUnknownType");
51 }
52
53 #[test]
54 fn test_error_display_unknown_error() {
55 let custom_error: Box<dyn std::error::Error> = Box::new(std::io::Error::new(
56 std::io::ErrorKind::NotFound,
57 "Test error"
58 ));
59 let error = Error::UnknownError(custom_error);
60 let display = format!("{}", error);
61 assert!(display.contains("Unknown Error"));
62 assert!(display.contains("Test error"));
63 }
64
65 #[test]
66 fn test_error_debug() {
67 let error = Error::UnknownType("TestType".to_string());
68 let debug = format!("{:?}", error);
69 assert!(debug.contains("UnknownType"));
70 assert!(debug.contains("TestType"));
71 }
72
73 #[test]
74 fn test_result_type_ok() {
75 let result: Result<i32> = Ok(42);
76 assert!(result.is_ok());
77 assert_eq!(result.unwrap(), 42);
78 }
79
80 #[test]
81 fn test_result_type_err() {
82 let result: Result<i32> = Err(Error::UnknownType("TestError".to_string()));
83 assert!(result.is_err());
84
85 match result {
86 Err(Error::UnknownType(msg)) => assert_eq!(msg, "TestError"),
87 _ => panic!("Expected UnknownType error"),
88 }
89 }
90
91 #[test]
92 fn test_error_chaining() {
93 let result: Result<i32> = Err(Error::UnknownType("ChainTest".to_string()));
94
95 let chained_result = result.map_err(|e| Error::UnknownError(Box::new(e)));
96
97 assert!(chained_result.is_err());
98 match chained_result {
99 Err(Error::UnknownError(_)) => (),
100 _ => panic!("Expected chained error"),
101 }
102 }
103}