pyo3_arrow/
error.rs

1//! Contains the [`PyArrowError`], the Error returned by most fallible functions in this crate.
2
3use numpy::BorrowError;
4use pyo3::exceptions::{PyException, PyValueError};
5use pyo3::prelude::*;
6use pyo3::CastError;
7use thiserror::Error;
8
9/// The Error variants returned by this crate.
10#[derive(Error, Debug)]
11#[non_exhaustive]
12pub enum PyArrowError {
13    /// A wrapped [arrow::error::ArrowError]
14    #[error(transparent)]
15    ArrowError(#[from] arrow_schema::ArrowError),
16
17    /// A wrapped [PyErr]
18    #[error(transparent)]
19    PyErr(#[from] PyErr),
20
21    /// Indicates why borrowing an array failed.
22    #[error(transparent)]
23    NumpyBorrowError(#[from] BorrowError),
24}
25
26impl From<PyArrowError> for PyErr {
27    fn from(error: PyArrowError) -> Self {
28        match error {
29            PyArrowError::PyErr(err) => err,
30            PyArrowError::ArrowError(err) => PyException::new_err(err.to_string()),
31            PyArrowError::NumpyBorrowError(err) => PyException::new_err(err.to_string()),
32        }
33    }
34}
35
36impl<'a, 'py> From<CastError<'a, 'py>> for PyArrowError {
37    fn from(other: CastError<'a, 'py>) -> Self {
38        Self::PyErr(PyValueError::new_err(format!(
39            "Could not downcast: {}",
40            other
41        )))
42    }
43}
44
45/// A type wrapper around `Result<T, PyArrowError>`.
46pub type PyArrowResult<T> = Result<T, PyArrowError>;