use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum ErrorCode {
MissingColumn,
DuplicateColumnName,
DuplicateKey,
ColumnLengthMismatch,
TypeMismatch,
ValueOutOfRange,
DivisionByZero,
IndexOutOfBounds,
NullUnexpected,
EmptyInput,
PathIsDirectory,
EmptyConstructionRequiresRuntime,
CrossDeviceInputs,
CrossProvenanceInputs,
RuntimeBindingMismatch,
ReadinessUnavailable,
ExecutionBindingUnavailable,
UnsupportedDtype,
UnsupportedLayout,
UnsupportedOperation,
OutOfMemory,
SizeOverflow,
HostMaterializationLimitExceeded,
CudaRuntime,
FatalCuda,
IoFailure,
IoBusy,
InvariantViolation,
ForeignInvalidArgument,
ForeignTransientDependencyFailure,
ForeignPersistentDependencyFailure,
ForeignInvariantViolation,
ForeignResourceExhausted,
}
impl ErrorCode {
pub const ALL: [Self; 33] = [
Self::MissingColumn,
Self::DuplicateColumnName,
Self::DuplicateKey,
Self::ColumnLengthMismatch,
Self::TypeMismatch,
Self::ValueOutOfRange,
Self::DivisionByZero,
Self::IndexOutOfBounds,
Self::NullUnexpected,
Self::EmptyInput,
Self::PathIsDirectory,
Self::EmptyConstructionRequiresRuntime,
Self::CrossDeviceInputs,
Self::CrossProvenanceInputs,
Self::RuntimeBindingMismatch,
Self::ReadinessUnavailable,
Self::ExecutionBindingUnavailable,
Self::UnsupportedDtype,
Self::UnsupportedLayout,
Self::UnsupportedOperation,
Self::OutOfMemory,
Self::SizeOverflow,
Self::HostMaterializationLimitExceeded,
Self::CudaRuntime,
Self::FatalCuda,
Self::IoFailure,
Self::IoBusy,
Self::InvariantViolation,
Self::ForeignInvalidArgument,
Self::ForeignTransientDependencyFailure,
Self::ForeignPersistentDependencyFailure,
Self::ForeignInvariantViolation,
Self::ForeignResourceExhausted,
];
}
impl fmt::Display for ErrorCode {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let name = match self {
ErrorCode::MissingColumn => "MissingColumn",
ErrorCode::DuplicateColumnName => "DuplicateColumnName",
ErrorCode::DuplicateKey => "DuplicateKey",
ErrorCode::ColumnLengthMismatch => "ColumnLengthMismatch",
ErrorCode::TypeMismatch => "TypeMismatch",
ErrorCode::ValueOutOfRange => "ValueOutOfRange",
ErrorCode::DivisionByZero => "DivisionByZero",
ErrorCode::IndexOutOfBounds => "IndexOutOfBounds",
ErrorCode::NullUnexpected => "NullUnexpected",
ErrorCode::EmptyConstructionRequiresRuntime => "EmptyConstructionRequiresRuntime",
ErrorCode::EmptyInput => "EmptyInput",
ErrorCode::PathIsDirectory => "PathIsDirectory",
ErrorCode::CrossDeviceInputs => "CrossDeviceInputs",
ErrorCode::CrossProvenanceInputs => "CrossProvenanceInputs",
ErrorCode::RuntimeBindingMismatch => "RuntimeBindingMismatch",
ErrorCode::ReadinessUnavailable => "ReadinessUnavailable",
ErrorCode::ExecutionBindingUnavailable => "ExecutionBindingUnavailable",
ErrorCode::UnsupportedDtype => "UnsupportedDtype",
ErrorCode::UnsupportedLayout => "UnsupportedLayout",
ErrorCode::UnsupportedOperation => "UnsupportedOperation",
ErrorCode::OutOfMemory => "OutOfMemory",
ErrorCode::SizeOverflow => "SizeOverflow",
ErrorCode::HostMaterializationLimitExceeded => "HostMaterializationLimitExceeded",
ErrorCode::CudaRuntime => "CudaRuntime",
ErrorCode::FatalCuda => "FatalCuda",
ErrorCode::IoFailure => "IoFailure",
ErrorCode::IoBusy => "IoBusy",
ErrorCode::InvariantViolation => "InvariantViolation",
ErrorCode::ForeignInvalidArgument => "ForeignInvalidArgument",
ErrorCode::ForeignTransientDependencyFailure => "ForeignTransientDependencyFailure",
ErrorCode::ForeignPersistentDependencyFailure => "ForeignPersistentDependencyFailure",
ErrorCode::ForeignInvariantViolation => "ForeignInvariantViolation",
ErrorCode::ForeignResourceExhausted => "ForeignResourceExhausted",
};
f.write_str(name)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum ErrorKind {
InvalidInput,
NotFound,
Unsupported,
ExecutionContext,
ResourceExhausted,
DependencyFailure,
InvariantViolation,
}
impl fmt::Display for ErrorKind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let name = match self {
ErrorKind::InvalidInput => "InvalidInput",
ErrorKind::NotFound => "NotFound",
ErrorKind::Unsupported => "Unsupported",
ErrorKind::ExecutionContext => "ExecutionContext",
ErrorKind::ResourceExhausted => "ResourceExhausted",
ErrorKind::DependencyFailure => "DependencyFailure",
ErrorKind::InvariantViolation => "InvariantViolation",
};
f.write_str(name)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ErrorStatus {
Permanent,
Temporary,
Persistent,
}
impl fmt::Display for ErrorStatus {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let name = match self {
ErrorStatus::Permanent => "permanent",
ErrorStatus::Temporary => "temporary",
ErrorStatus::Persistent => "persistent",
};
f.write_str(name)
}
}
pub const fn kind_for_code(code: ErrorCode) -> ErrorKind {
match code {
ErrorCode::MissingColumn => ErrorKind::NotFound,
ErrorCode::DuplicateColumnName
| ErrorCode::DuplicateKey
| ErrorCode::ColumnLengthMismatch
| ErrorCode::TypeMismatch
| ErrorCode::ValueOutOfRange
| ErrorCode::DivisionByZero
| ErrorCode::IndexOutOfBounds
| ErrorCode::NullUnexpected
| ErrorCode::PathIsDirectory
| ErrorCode::ForeignInvalidArgument => ErrorKind::InvalidInput,
ErrorCode::EmptyInput => ErrorKind::InvalidInput,
ErrorCode::EmptyConstructionRequiresRuntime
| ErrorCode::CrossDeviceInputs
| ErrorCode::CrossProvenanceInputs
| ErrorCode::RuntimeBindingMismatch
| ErrorCode::ReadinessUnavailable
| ErrorCode::ExecutionBindingUnavailable => ErrorKind::ExecutionContext,
ErrorCode::UnsupportedDtype | ErrorCode::UnsupportedLayout | ErrorCode::UnsupportedOperation => {
ErrorKind::Unsupported
},
ErrorCode::OutOfMemory
| ErrorCode::SizeOverflow
| ErrorCode::HostMaterializationLimitExceeded
| ErrorCode::IoBusy
| ErrorCode::ForeignResourceExhausted => ErrorKind::ResourceExhausted,
ErrorCode::CudaRuntime
| ErrorCode::FatalCuda
| ErrorCode::IoFailure
| ErrorCode::ForeignTransientDependencyFailure
| ErrorCode::ForeignPersistentDependencyFailure => ErrorKind::DependencyFailure,
ErrorCode::InvariantViolation | ErrorCode::ForeignInvariantViolation => ErrorKind::InvariantViolation,
}
}
pub const fn status_for_code(code: ErrorCode) -> ErrorStatus {
match code {
ErrorCode::OutOfMemory
| ErrorCode::IoBusy
| ErrorCode::CudaRuntime
| ErrorCode::ForeignTransientDependencyFailure
| ErrorCode::ForeignResourceExhausted => ErrorStatus::Temporary,
ErrorCode::FatalCuda | ErrorCode::ForeignPersistentDependencyFailure => ErrorStatus::Persistent,
ErrorCode::MissingColumn
| ErrorCode::DuplicateColumnName
| ErrorCode::DuplicateKey
| ErrorCode::ColumnLengthMismatch
| ErrorCode::TypeMismatch
| ErrorCode::ValueOutOfRange
| ErrorCode::DivisionByZero
| ErrorCode::IndexOutOfBounds
| ErrorCode::NullUnexpected
| ErrorCode::EmptyConstructionRequiresRuntime
| ErrorCode::EmptyInput
| ErrorCode::PathIsDirectory
| ErrorCode::CrossDeviceInputs
| ErrorCode::CrossProvenanceInputs
| ErrorCode::RuntimeBindingMismatch
| ErrorCode::ReadinessUnavailable
| ErrorCode::ExecutionBindingUnavailable
| ErrorCode::UnsupportedDtype
| ErrorCode::UnsupportedLayout
| ErrorCode::UnsupportedOperation
| ErrorCode::SizeOverflow
| ErrorCode::HostMaterializationLimitExceeded
| ErrorCode::IoFailure
| ErrorCode::InvariantViolation
| ErrorCode::ForeignInvalidArgument
| ErrorCode::ForeignInvariantViolation => ErrorStatus::Permanent,
}
}