1use thiserror::Error;
4
5pub type Result<T> = std::result::Result<T, JsonnetError>;
7
8#[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 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 pub fn runtime_error(message: impl Into<String>) -> Self {
73 JsonnetError::RuntimeError {
74 message: message.into(),
75 }
76 }
77
78 pub fn type_error(message: impl Into<String>) -> Self {
80 JsonnetError::TypeError {
81 message: message.into(),
82 }
83 }
84
85 pub fn undefined_variable(name: impl Into<String>) -> Self {
87 JsonnetError::UndefinedVariable {
88 name: name.into(),
89 }
90 }
91
92 pub fn undefined_field(field: impl Into<String>) -> Self {
94 JsonnetError::UndefinedField {
95 field: field.into(),
96 }
97 }
98
99 pub fn index_out_of_bounds(index: i64) -> Self {
101 JsonnetError::IndexOutOfBounds { index }
102 }
103
104 pub fn invalid_function_call(message: impl Into<String>) -> Self {
106 JsonnetError::InvalidFunctionCall {
107 message: message.into(),
108 }
109 }
110
111 pub fn import_error(path: impl Into<String>) -> Self {
113 JsonnetError::ImportError {
114 path: path.into(),
115 }
116 }
117
118 pub fn io_error(message: impl Into<String>) -> Self {
120 JsonnetError::IoError {
121 message: message.into(),
122 }
123 }
124
125 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}