pyo3_arrow/
error.rs

1//! Contains the [`PyArrowError`], the Error returned by most fallible functions in this crate.
2
3use pyo3::exceptions::{PyException, PyValueError};
4use pyo3::prelude::*;
5use pyo3::DowncastError;
6use thiserror::Error;
7
8/// The Error variants returned by this crate.
9#[derive(Error, Debug)]
10#[non_exhaustive]
11pub enum PyArrowError {
12    /// A wrapped [arrow::error::ArrowError]
13    #[error(transparent)]
14    ArrowError(#[from] arrow::error::ArrowError),
15
16    /// A wrapped [PyErr]
17    #[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
39/// A type wrapper around `Result<T, PyArrowError>`.
40pub type PyArrowResult<T> = Result<T, PyArrowError>;