tellaro_query_language/
error.rs1use thiserror::Error;
7
8pub type Result<T> = std::result::Result<T, TqlError>;
10
11#[derive(Error, Debug, Clone, PartialEq)]
13pub enum TqlError {
14 #[error("Parse error at position {position}: {message}")]
16 ParseError {
17 message: String,
18 position: usize,
19 query: Option<String>,
20 },
21
22 #[error("Syntax error: {message}")]
24 SyntaxError {
25 message: String,
26 position: Option<usize>,
27 query: Option<String>,
28 suggestions: Vec<String>,
29 },
30
31 #[error("Field error: {0}")]
33 FieldError(String),
34
35 #[error("Type error: {0}")]
37 TypeError(String),
38
39 #[error("Operator error: {0}")]
41 OperatorError(String),
42
43 #[error("Value error: {0}")]
45 ValueError(String),
46
47 #[error("Execution error: {0}")]
49 ExecutionError(String),
50
51 #[error("Validation error: {0}")]
53 ValidationError(String),
54
55 #[error("Unsupported operation: {0}")]
57 UnsupportedOperation(String),
58
59 #[error("I/O error: {0}")]
61 IoError(String),
62
63 #[error("Network error: {0}")]
65 NetworkError(String),
66
67 #[error("Mutator error: {0}")]
69 MutatorError(String),
70}
71
72impl From<std::io::Error> for TqlError {
73 fn from(err: std::io::Error) -> Self {
74 TqlError::IoError(err.to_string())
75 }
76}
77
78impl From<serde_json::Error> for TqlError {
79 fn from(err: serde_json::Error) -> Self {
80 TqlError::ExecutionError(format!("JSON error: {}", err))
81 }
82}
83
84#[cfg(test)]
85mod tests {
86 use super::*;
87
88 #[test]
89 fn test_error_display() {
90 let err = TqlError::ParseError {
91 message: "Unexpected token".to_string(),
92 position: 5,
93 query: Some("field eq".to_string()),
94 };
95 assert!(err.to_string().contains("position 5"));
96 }
97
98 #[test]
99 fn test_syntax_error_with_suggestions() {
100 let err = TqlError::SyntaxError {
101 message: "Missing value".to_string(),
102 position: Some(8),
103 query: Some("field eq".to_string()),
104 suggestions: vec!["field eq 'value'".to_string()],
105 };
106 assert!(err.to_string().contains("Syntax error"));
107 }
108
109 #[test]
110 fn test_io_error_conversion() {
111 let io_err = std::io::Error::new(std::io::ErrorKind::NotFound, "file not found");
112 let tql_err: TqlError = io_err.into();
113 assert!(matches!(tql_err, TqlError::IoError(_)));
114 }
115}