1use pyo3::exceptions::{PyException, PyValueError};
4use pyo3::prelude::*;
5use pyo3::DowncastError;
6use thiserror::Error;
7
8#[derive(Error, Debug)]
10#[non_exhaustive]
11pub enum PyArrowError {
12 #[error(transparent)]
14 ArrowError(#[from] arrow::error::ArrowError),
15
16 #[error(transparent)]
18 PyErr(#[from] PyErr),
19}
20
21impl From<PyArrowError> for PyErr {
22 fn from(error: PyArrowError) -> Self {
23 match error {
24 PyArrowError::PyErr(err) => err,
25 PyArrowError::ArrowError(err) => PyException::new_err(err.to_string()),
26 }
27 }
28}
29
30impl<'a, 'py> From<DowncastError<'a, 'py>> for PyArrowError {
31 fn from(other: DowncastError<'a, 'py>) -> Self {
32 Self::PyErr(PyValueError::new_err(format!(
33 "Could not downcast: {}",
34 other
35 )))
36 }
37}
38
39pub type PyArrowResult<T> = Result<T, PyArrowError>;