1use std::fmt;
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
15#[non_exhaustive]
16pub enum ErrorCode {
17 MissingColumn,
20 DuplicateColumnName,
22 DuplicateKey,
24 ColumnLengthMismatch,
26 TypeMismatch,
28 ValueOutOfRange,
31 DivisionByZero,
34 IndexOutOfBounds,
36 NullUnexpected,
55 EmptyInput,
58 PathIsDirectory,
60
61 EmptyConstructionRequiresRuntime,
64 CrossDeviceInputs,
67 CrossProvenanceInputs,
69 RuntimeBindingMismatch,
71 ReadinessUnavailable,
73 ExecutionBindingUnavailable,
76
77 UnsupportedDtype,
80 UnsupportedLayout,
82 UnsupportedOperation,
84
85 OutOfMemory,
88 SizeOverflow,
91 HostMaterializationLimitExceeded,
94 CudaRuntime,
96 FatalCuda,
98 IoFailure,
100 IoBusy,
102
103 InvariantViolation,
106
107 ForeignInvalidArgument,
111 ForeignTransientDependencyFailure,
114 ForeignPersistentDependencyFailure,
117 ForeignInvariantViolation,
120 ForeignResourceExhausted,
123}
124
125impl ErrorCode {
126 pub const ALL: [Self; 33] = [
128 Self::MissingColumn,
129 Self::DuplicateColumnName,
130 Self::DuplicateKey,
131 Self::ColumnLengthMismatch,
132 Self::TypeMismatch,
133 Self::ValueOutOfRange,
134 Self::DivisionByZero,
135 Self::IndexOutOfBounds,
136 Self::NullUnexpected,
137 Self::EmptyInput,
138 Self::PathIsDirectory,
139 Self::EmptyConstructionRequiresRuntime,
140 Self::CrossDeviceInputs,
141 Self::CrossProvenanceInputs,
142 Self::RuntimeBindingMismatch,
143 Self::ReadinessUnavailable,
144 Self::ExecutionBindingUnavailable,
145 Self::UnsupportedDtype,
146 Self::UnsupportedLayout,
147 Self::UnsupportedOperation,
148 Self::OutOfMemory,
149 Self::SizeOverflow,
150 Self::HostMaterializationLimitExceeded,
151 Self::CudaRuntime,
152 Self::FatalCuda,
153 Self::IoFailure,
154 Self::IoBusy,
155 Self::InvariantViolation,
156 Self::ForeignInvalidArgument,
157 Self::ForeignTransientDependencyFailure,
158 Self::ForeignPersistentDependencyFailure,
159 Self::ForeignInvariantViolation,
160 Self::ForeignResourceExhausted,
161 ];
162}
163
164impl fmt::Display for ErrorCode {
165 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
166 let name = match self {
167 ErrorCode::MissingColumn => "MissingColumn",
168 ErrorCode::DuplicateColumnName => "DuplicateColumnName",
169 ErrorCode::DuplicateKey => "DuplicateKey",
170 ErrorCode::ColumnLengthMismatch => "ColumnLengthMismatch",
171 ErrorCode::TypeMismatch => "TypeMismatch",
172 ErrorCode::ValueOutOfRange => "ValueOutOfRange",
173 ErrorCode::DivisionByZero => "DivisionByZero",
174 ErrorCode::IndexOutOfBounds => "IndexOutOfBounds",
175 ErrorCode::NullUnexpected => "NullUnexpected",
176 ErrorCode::EmptyConstructionRequiresRuntime => "EmptyConstructionRequiresRuntime",
177 ErrorCode::EmptyInput => "EmptyInput",
178 ErrorCode::PathIsDirectory => "PathIsDirectory",
179 ErrorCode::CrossDeviceInputs => "CrossDeviceInputs",
180 ErrorCode::CrossProvenanceInputs => "CrossProvenanceInputs",
181 ErrorCode::RuntimeBindingMismatch => "RuntimeBindingMismatch",
182 ErrorCode::ReadinessUnavailable => "ReadinessUnavailable",
183 ErrorCode::ExecutionBindingUnavailable => "ExecutionBindingUnavailable",
184 ErrorCode::UnsupportedDtype => "UnsupportedDtype",
185 ErrorCode::UnsupportedLayout => "UnsupportedLayout",
186 ErrorCode::UnsupportedOperation => "UnsupportedOperation",
187 ErrorCode::OutOfMemory => "OutOfMemory",
188 ErrorCode::SizeOverflow => "SizeOverflow",
189 ErrorCode::HostMaterializationLimitExceeded => "HostMaterializationLimitExceeded",
190 ErrorCode::CudaRuntime => "CudaRuntime",
191 ErrorCode::FatalCuda => "FatalCuda",
192 ErrorCode::IoFailure => "IoFailure",
193 ErrorCode::IoBusy => "IoBusy",
194 ErrorCode::InvariantViolation => "InvariantViolation",
195 ErrorCode::ForeignInvalidArgument => "ForeignInvalidArgument",
196 ErrorCode::ForeignTransientDependencyFailure => "ForeignTransientDependencyFailure",
197 ErrorCode::ForeignPersistentDependencyFailure => "ForeignPersistentDependencyFailure",
198 ErrorCode::ForeignInvariantViolation => "ForeignInvariantViolation",
199 ErrorCode::ForeignResourceExhausted => "ForeignResourceExhausted",
200 };
201 f.write_str(name)
202 }
203}
204
205#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
210#[non_exhaustive]
211pub enum ErrorKind {
212 InvalidInput,
214 NotFound,
216 Unsupported,
218 ExecutionContext,
220 ResourceExhausted,
222 DependencyFailure,
224 InvariantViolation,
226}
227
228impl fmt::Display for ErrorKind {
229 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
230 let name = match self {
231 ErrorKind::InvalidInput => "InvalidInput",
232 ErrorKind::NotFound => "NotFound",
233 ErrorKind::Unsupported => "Unsupported",
234 ErrorKind::ExecutionContext => "ExecutionContext",
235 ErrorKind::ResourceExhausted => "ResourceExhausted",
236 ErrorKind::DependencyFailure => "DependencyFailure",
237 ErrorKind::InvariantViolation => "InvariantViolation",
238 };
239 f.write_str(name)
240 }
241}
242
243#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
245pub enum ErrorStatus {
246 Permanent,
248 Temporary,
250 Persistent,
252}
253
254impl fmt::Display for ErrorStatus {
255 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
256 let name = match self {
257 ErrorStatus::Permanent => "permanent",
258 ErrorStatus::Temporary => "temporary",
259 ErrorStatus::Persistent => "persistent",
260 };
261 f.write_str(name)
262 }
263}
264
265pub const fn kind_for_code(code: ErrorCode) -> ErrorKind {
270 match code {
271 ErrorCode::MissingColumn => ErrorKind::NotFound,
272
273 ErrorCode::DuplicateColumnName
274 | ErrorCode::DuplicateKey
275 | ErrorCode::ColumnLengthMismatch
276 | ErrorCode::TypeMismatch
277 | ErrorCode::ValueOutOfRange
278 | ErrorCode::DivisionByZero
279 | ErrorCode::IndexOutOfBounds
280 | ErrorCode::NullUnexpected
281 | ErrorCode::PathIsDirectory
282 | ErrorCode::ForeignInvalidArgument => ErrorKind::InvalidInput,
283
284 ErrorCode::EmptyInput => ErrorKind::InvalidInput,
285
286 ErrorCode::EmptyConstructionRequiresRuntime
287 | ErrorCode::CrossDeviceInputs
288 | ErrorCode::CrossProvenanceInputs
289 | ErrorCode::RuntimeBindingMismatch
290 | ErrorCode::ReadinessUnavailable
291 | ErrorCode::ExecutionBindingUnavailable => ErrorKind::ExecutionContext,
292
293 ErrorCode::UnsupportedDtype | ErrorCode::UnsupportedLayout | ErrorCode::UnsupportedOperation => {
294 ErrorKind::Unsupported
295 },
296
297 ErrorCode::OutOfMemory
298 | ErrorCode::SizeOverflow
299 | ErrorCode::HostMaterializationLimitExceeded
300 | ErrorCode::IoBusy
301 | ErrorCode::ForeignResourceExhausted => ErrorKind::ResourceExhausted,
302
303 ErrorCode::CudaRuntime
304 | ErrorCode::FatalCuda
305 | ErrorCode::IoFailure
306 | ErrorCode::ForeignTransientDependencyFailure
307 | ErrorCode::ForeignPersistentDependencyFailure => ErrorKind::DependencyFailure,
308
309 ErrorCode::InvariantViolation | ErrorCode::ForeignInvariantViolation => ErrorKind::InvariantViolation,
310 }
311}
312
313pub const fn status_for_code(code: ErrorCode) -> ErrorStatus {
318 match code {
319 ErrorCode::OutOfMemory
320 | ErrorCode::IoBusy
321 | ErrorCode::CudaRuntime
322 | ErrorCode::ForeignTransientDependencyFailure
323 | ErrorCode::ForeignResourceExhausted => ErrorStatus::Temporary,
324
325 ErrorCode::FatalCuda | ErrorCode::ForeignPersistentDependencyFailure => ErrorStatus::Persistent,
326
327 ErrorCode::MissingColumn
328 | ErrorCode::DuplicateColumnName
329 | ErrorCode::DuplicateKey
330 | ErrorCode::ColumnLengthMismatch
331 | ErrorCode::TypeMismatch
332 | ErrorCode::ValueOutOfRange
333 | ErrorCode::DivisionByZero
334 | ErrorCode::IndexOutOfBounds
335 | ErrorCode::NullUnexpected
336 | ErrorCode::EmptyConstructionRequiresRuntime
337 | ErrorCode::EmptyInput
338 | ErrorCode::PathIsDirectory
339 | ErrorCode::CrossDeviceInputs
340 | ErrorCode::CrossProvenanceInputs
341 | ErrorCode::RuntimeBindingMismatch
342 | ErrorCode::ReadinessUnavailable
343 | ErrorCode::ExecutionBindingUnavailable
344 | ErrorCode::UnsupportedDtype
345 | ErrorCode::UnsupportedLayout
346 | ErrorCode::UnsupportedOperation
347 | ErrorCode::SizeOverflow
348 | ErrorCode::HostMaterializationLimitExceeded
349 | ErrorCode::IoFailure
350 | ErrorCode::InvariantViolation
351 | ErrorCode::ForeignInvalidArgument
352 | ErrorCode::ForeignInvariantViolation => ErrorStatus::Permanent,
353 }
354}