Skip to main content

graphrecords_python/graphrecord/
errors.rs

1use crate::querying::exception::FailureConversion;
2use graphrecords_core::errors::{GraphRecordError, SchemaError};
3use graphrecords_overview::OverviewError;
4use graphrecords_query::Failure;
5use pyo3::{
6    PyErr,
7    exceptions::{PyAssertionError, PyIndexError, PyKeyError, PyRuntimeError, PyValueError},
8};
9
10pub enum PyGraphRecordError {
11    GraphRecord(GraphRecordError),
12    Conversion(String),
13    Query(Box<Failure>),
14}
15pub type PyGraphRecordResult<T> = Result<T, PyGraphRecordError>;
16
17impl From<GraphRecordError> for PyGraphRecordError {
18    fn from(error: GraphRecordError) -> Self {
19        Self::GraphRecord(error)
20    }
21}
22
23impl From<SchemaError> for PyGraphRecordError {
24    fn from(error: SchemaError) -> Self {
25        Self::GraphRecord(GraphRecordError::from(error))
26    }
27}
28
29impl From<OverviewError> for PyGraphRecordError {
30    fn from(error: OverviewError) -> Self {
31        match error {
32            OverviewError::GraphRecord(error) => Self::GraphRecord(error),
33            OverviewError::Query(failure) => Self::Query(failure),
34        }
35    }
36}
37
38impl From<PyGraphRecordError> for PyErr {
39    fn from(error: PyGraphRecordError) -> Self {
40        let error = match error {
41            PyGraphRecordError::GraphRecord(error) => error,
42            PyGraphRecordError::Conversion(message) => {
43                return PyRuntimeError::new_err(message);
44            }
45            PyGraphRecordError::Query(failure) => {
46                return failure.to_python_error();
47            }
48        };
49
50        let message = error.to_string();
51
52        match error {
53            GraphRecordError::NodeNotFound { .. }
54            | GraphRecordError::EdgeNotFound { .. }
55            | GraphRecordError::GroupNotFound { .. } => PyIndexError::new_err(message),
56            GraphRecordError::NodeAttributeNotFound { .. }
57            | GraphRecordError::EdgeAttributeNotFound { .. }
58            | GraphRecordError::PluginNotFound { .. }
59            | GraphRecordError::PluginAlreadyExists { .. } => PyKeyError::new_err(message),
60            GraphRecordError::NodeAlreadyExists { .. }
61            | GraphRecordError::GroupAlreadyExists { .. }
62            | GraphRecordError::NodeAlreadyInGroup { .. }
63            | GraphRecordError::EdgeAlreadyInGroup { .. }
64            | GraphRecordError::NodeNotInGroup { .. }
65            | GraphRecordError::EdgeNotInGroup { .. }
66            | GraphRecordError::IncompatibleValueOperands { .. }
67            | GraphRecordError::IncompatibleAttributeOperands { .. }
68            | GraphRecordError::InvalidTimestamp => PyAssertionError::new_err(message),
69            GraphRecordError::Schema(_) => PyValueError::new_err(message),
70            GraphRecordError::PluginFailure { .. }
71            | GraphRecordError::ConnectorFailure { .. }
72            | GraphRecordError::Conversion(_) => PyRuntimeError::new_err(message),
73        }
74    }
75}