graphrecords-python 0.5.0

High-performance graph-based data records
Documentation
use crate::querying::exception::FailureConversion;
use graphrecords_core::errors::{GraphRecordError, SchemaError};
use graphrecords_overview::OverviewError;
use graphrecords_query::Failure;
use pyo3::{
    PyErr,
    exceptions::{PyAssertionError, PyIndexError, PyKeyError, PyRuntimeError, PyValueError},
};

pub enum PyGraphRecordError {
    GraphRecord(GraphRecordError),
    Conversion(String),
    Query(Box<Failure>),
}
pub type PyGraphRecordResult<T> = Result<T, PyGraphRecordError>;

impl From<GraphRecordError> for PyGraphRecordError {
    fn from(error: GraphRecordError) -> Self {
        Self::GraphRecord(error)
    }
}

impl From<SchemaError> for PyGraphRecordError {
    fn from(error: SchemaError) -> Self {
        Self::GraphRecord(GraphRecordError::from(error))
    }
}

impl From<OverviewError> for PyGraphRecordError {
    fn from(error: OverviewError) -> Self {
        match error {
            OverviewError::GraphRecord(error) => Self::GraphRecord(error),
            OverviewError::Query(failure) => Self::Query(failure),
        }
    }
}

impl From<PyGraphRecordError> for PyErr {
    fn from(error: PyGraphRecordError) -> Self {
        let error = match error {
            PyGraphRecordError::GraphRecord(error) => error,
            PyGraphRecordError::Conversion(message) => {
                return PyRuntimeError::new_err(message);
            }
            PyGraphRecordError::Query(failure) => {
                return failure.to_python_error();
            }
        };

        let message = error.to_string();

        match error {
            GraphRecordError::NodeNotFound { .. }
            | GraphRecordError::EdgeNotFound { .. }
            | GraphRecordError::GroupNotFound { .. } => PyIndexError::new_err(message),
            GraphRecordError::NodeAttributeNotFound { .. }
            | GraphRecordError::EdgeAttributeNotFound { .. }
            | GraphRecordError::PluginNotFound { .. }
            | GraphRecordError::PluginAlreadyExists { .. } => PyKeyError::new_err(message),
            GraphRecordError::NodeAlreadyExists { .. }
            | GraphRecordError::GroupAlreadyExists { .. }
            | GraphRecordError::NodeAlreadyInGroup { .. }
            | GraphRecordError::EdgeAlreadyInGroup { .. }
            | GraphRecordError::NodeNotInGroup { .. }
            | GraphRecordError::EdgeNotInGroup { .. }
            | GraphRecordError::IncompatibleValueOperands { .. }
            | GraphRecordError::IncompatibleAttributeOperands { .. }
            | GraphRecordError::InvalidTimestamp => PyAssertionError::new_err(message),
            GraphRecordError::Schema(_) => PyValueError::new_err(message),
            GraphRecordError::PluginFailure { .. }
            | GraphRecordError::ConnectorFailure { .. }
            | GraphRecordError::Conversion(_) => PyRuntimeError::new_err(message),
        }
    }
}