1use std::fmt::{Debug, Display, Formatter};
20use std::io::Write;
21
22use std::error::Error;
23
24#[derive(Debug)]
26pub enum ArrowError {
27 NotYetImplemented(String),
29 ExternalError(Box<dyn Error + Send + Sync>),
31 CastError(String),
33 MemoryError(String),
35 ParseError(String),
37 SchemaError(String),
39 ComputeError(String),
41 DivideByZero,
43 ArithmeticOverflow(String),
45 CsvError(String),
47 JsonError(String),
49 IoError(String, std::io::Error),
51 IpcError(String),
53 InvalidArgumentError(String),
55 ParquetError(String),
57 CDataInterface(String),
59 DictionaryKeyOverflowError,
61 RunEndIndexOverflowError,
63 OffsetOverflowError(usize),
65}
66
67impl ArrowError {
68 pub fn from_external_error(error: Box<dyn Error + Send + Sync>) -> Self {
70 Self::ExternalError(error)
71 }
72}
73
74impl From<std::io::Error> for ArrowError {
75 fn from(error: std::io::Error) -> Self {
76 ArrowError::IoError(error.to_string(), error)
77 }
78}
79
80impl From<std::str::Utf8Error> for ArrowError {
81 fn from(error: std::str::Utf8Error) -> Self {
82 ArrowError::ParseError(error.to_string())
83 }
84}
85
86impl From<std::string::FromUtf8Error> for ArrowError {
87 fn from(error: std::string::FromUtf8Error) -> Self {
88 ArrowError::ParseError(error.to_string())
89 }
90}
91
92impl<W: Write> From<std::io::IntoInnerError<W>> for ArrowError {
93 fn from(error: std::io::IntoInnerError<W>) -> Self {
94 ArrowError::IoError(error.to_string(), error.into())
95 }
96}
97
98impl Display for ArrowError {
99 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
100 match self {
101 ArrowError::NotYetImplemented(source) => {
102 write!(f, "Not yet implemented: {}", &source)
103 }
104 ArrowError::ExternalError(source) => write!(f, "External error: {}", &source),
105 ArrowError::CastError(desc) => write!(f, "Cast error: {desc}"),
106 ArrowError::MemoryError(desc) => write!(f, "Memory error: {desc}"),
107 ArrowError::ParseError(desc) => write!(f, "Parser error: {desc}"),
108 ArrowError::SchemaError(desc) => write!(f, "Schema error: {desc}"),
109 ArrowError::ComputeError(desc) => write!(f, "Compute error: {desc}"),
110 ArrowError::ArithmeticOverflow(desc) => write!(f, "Arithmetic overflow: {desc}"),
111 ArrowError::DivideByZero => write!(f, "Divide by zero error"),
112 ArrowError::CsvError(desc) => write!(f, "Csv error: {desc}"),
113 ArrowError::JsonError(desc) => write!(f, "Json error: {desc}"),
114 ArrowError::IoError(desc, _) => write!(f, "Io error: {desc}"),
115 ArrowError::IpcError(desc) => write!(f, "Ipc error: {desc}"),
116 ArrowError::InvalidArgumentError(desc) => {
117 write!(f, "Invalid argument error: {desc}")
118 }
119 ArrowError::ParquetError(desc) => {
120 write!(f, "Parquet argument error: {desc}")
121 }
122 ArrowError::CDataInterface(desc) => {
123 write!(f, "C Data interface error: {desc}")
124 }
125 ArrowError::DictionaryKeyOverflowError => {
126 write!(f, "Dictionary key bigger than the key type")
127 }
128 ArrowError::RunEndIndexOverflowError => {
129 write!(f, "Run end encoded array index overflow error")
130 }
131 ArrowError::OffsetOverflowError(offset) => {
132 write!(f, "Offset overflow error: {offset}")
133 }
134 }
135 }
136}
137
138impl Error for ArrowError {
139 fn source(&self) -> Option<&(dyn Error + 'static)> {
140 match self {
141 ArrowError::ExternalError(source) => Some(source.as_ref()),
142 ArrowError::IoError(_, source) => Some(source),
143 _ => None,
144 }
145 }
146}
147
148#[cfg(test)]
149mod test {
150 use super::*;
151
152 #[test]
153 fn error_source() {
154 let e1 = ArrowError::DivideByZero;
155 assert!(e1.source().is_none());
156
157 let e2 = ArrowError::ExternalError(Box::new(e1));
159 let source = e2.source().unwrap().downcast_ref::<ArrowError>().unwrap();
160 assert!(matches!(source, ArrowError::DivideByZero));
161
162 let e3 = ArrowError::ExternalError(Box::new(e2));
164 let source = e3
165 .source()
166 .unwrap()
167 .downcast_ref::<ArrowError>()
168 .unwrap()
169 .source()
170 .unwrap()
171 .downcast_ref::<ArrowError>()
172 .unwrap();
173
174 assert!(matches!(source, ArrowError::DivideByZero));
175 }
176}