tellaro_query_language/
error.rs

1//! Error types for TQL operations.
2//!
3//! This module defines all error types that can occur during TQL parsing,
4//! evaluation, and execution. Matches Python implementation's exception hierarchy.
5
6use thiserror::Error;
7
8/// Result type alias for TQL operations
9pub type Result<T> = std::result::Result<T, TqlError>;
10
11/// Main error type for TQL operations
12#[derive(Error, Debug, Clone, PartialEq)]
13pub enum TqlError {
14    /// Parse error with position information
15    #[error("Parse error at position {position}: {message}")]
16    ParseError {
17        message: String,
18        position: usize,
19        query: Option<String>,
20    },
21
22    /// Syntax error in query
23    #[error("Syntax error: {message}")]
24    SyntaxError {
25        message: String,
26        position: Option<usize>,
27        query: Option<String>,
28        suggestions: Vec<String>,
29    },
30
31    /// Field not found or invalid field access
32    #[error("Field error: {0}")]
33    FieldError(String),
34
35    /// Type mismatch or type conversion error
36    #[error("Type error: {0}")]
37    TypeError(String),
38
39    /// Invalid operator usage
40    #[error("Operator error: {0}")]
41    OperatorError(String),
42
43    /// Invalid value
44    #[error("Value error: {0}")]
45    ValueError(String),
46
47    /// Query execution error
48    #[error("Execution error: {0}")]
49    ExecutionError(String),
50
51    /// Validation error
52    #[error("Validation error: {0}")]
53    ValidationError(String),
54
55    /// Unsupported operation
56    #[error("Unsupported operation: {0}")]
57    UnsupportedOperation(String),
58
59    /// I/O error
60    #[error("I/O error: {0}")]
61    IoError(String),
62
63    /// Network error (DNS, GeoIP, etc.)
64    #[error("Network error: {0}")]
65    NetworkError(String),
66
67    /// Mutator error
68    #[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}