kotoba_jsonnet/
error.rs

1//! Error types for Jsonnet evaluation
2
3use thiserror::Error;
4
5/// Result type for Jsonnet operations
6pub type Result<T> = std::result::Result<T, JsonnetError>;
7
8/// Jsonnet evaluation errors
9#[derive(Error, Debug, Clone, PartialEq)]
10pub enum JsonnetError {
11    #[error("Parse error at line {line}, column {column}: {message}")]
12    ParseError {
13        line: usize,
14        column: usize,
15        message: String,
16    },
17
18    #[error("Runtime error: {message}")]
19    RuntimeError { message: String },
20
21    #[error("Type error: {message}")]
22    TypeError { message: String },
23
24    #[error("Undefined variable: {name}")]
25    UndefinedVariable { name: String },
26
27    #[error("Undefined field: {field}")]
28    UndefinedField { field: String },
29
30    #[error("Index out of bounds: {index}")]
31    IndexOutOfBounds { index: i64 },
32
33    #[error("Division by zero")]
34    DivisionByZero,
35
36    #[error("Invalid function call: {message}")]
37    InvalidFunctionCall { message: String },
38
39    #[error("Import error: {path}")]
40    ImportError { path: String },
41
42    #[error("IO error: {message}")]
43    IoError { message: String },
44
45    #[error("Assertion failed: {message}")]
46    AssertionFailed { message: String },
47
48    #[error("Stack overflow")]
49    StackOverflow,
50
51    #[error("Maximum recursion depth exceeded")]
52    MaxRecursionExceeded,
53
54    #[error("Invalid UTF-8 sequence")]
55    InvalidUtf8,
56
57    #[error("Regex error: {message}")]
58    RegexError { message: String },
59}
60
61impl JsonnetError {
62    /// Create a parse error
63    pub fn parse_error(line: usize, column: usize, message: impl Into<String>) -> Self {
64        JsonnetError::ParseError {
65            line,
66            column,
67            message: message.into(),
68        }
69    }
70
71    /// Create a runtime error
72    pub fn runtime_error(message: impl Into<String>) -> Self {
73        JsonnetError::RuntimeError {
74            message: message.into(),
75        }
76    }
77
78    /// Create a type error
79    pub fn type_error(message: impl Into<String>) -> Self {
80        JsonnetError::TypeError {
81            message: message.into(),
82        }
83    }
84
85    /// Create an undefined variable error
86    pub fn undefined_variable(name: impl Into<String>) -> Self {
87        JsonnetError::UndefinedVariable {
88            name: name.into(),
89        }
90    }
91
92    /// Create an undefined field error
93    pub fn undefined_field(field: impl Into<String>) -> Self {
94        JsonnetError::UndefinedField {
95            field: field.into(),
96        }
97    }
98
99    /// Create an index out of bounds error
100    pub fn index_out_of_bounds(index: i64) -> Self {
101        JsonnetError::IndexOutOfBounds { index }
102    }
103
104    /// Create an invalid function call error
105    pub fn invalid_function_call(message: impl Into<String>) -> Self {
106        JsonnetError::InvalidFunctionCall {
107            message: message.into(),
108        }
109    }
110
111    /// Create an import error
112    pub fn import_error(path: impl Into<String>) -> Self {
113        JsonnetError::ImportError {
114            path: path.into(),
115        }
116    }
117
118    /// Create an IO error
119    pub fn io_error(message: impl Into<String>) -> Self {
120        JsonnetError::IoError {
121            message: message.into(),
122        }
123    }
124
125    /// Create an assertion failed error
126    pub fn assertion_failed(message: impl Into<String>) -> Self {
127        JsonnetError::AssertionFailed {
128            message: message.into(),
129        }
130    }
131}
132
133impl From<std::io::Error> for JsonnetError {
134    fn from(err: std::io::Error) -> Self {
135        JsonnetError::io_error(err.to_string())
136    }
137}
138
139impl From<serde_json::Error> for JsonnetError {
140    fn from(err: serde_json::Error) -> Self {
141        JsonnetError::runtime_error(format!("JSON serialization error: {}", err))
142    }
143}
144
145impl From<regex::Error> for JsonnetError {
146    fn from(err: regex::Error) -> Self {
147        JsonnetError::RegexError {
148            message: err.to_string(),
149        }
150    }
151}
152
153#[cfg(feature = "yaml")]
154impl From<serde_yaml::Error> for JsonnetError {
155    fn from(err: serde_yaml::Error) -> Self {
156        JsonnetError::runtime_error(format!("YAML serialization error: {}", err))
157    }
158}