use snafu::{prelude::*, Location};
pub type Result<T> = std::result::Result<T, GraphError>;
#[derive(Debug, Snafu)]
#[snafu(visibility(pub(crate)))]
pub enum GraphError {
#[snafu(display("Cypher parse error at position {position}: {message}"))]
ParseError {
message: String,
position: usize,
location: Location,
},
#[snafu(display("Graph configuration error: {message}"))]
ConfigError { message: String, location: Location },
#[snafu(display("Query planning error: {message}"))]
PlanError { message: String, location: Location },
#[snafu(display("Query execution error: {message}"))]
ExecutionError { message: String, location: Location },
#[snafu(display("Unsupported Cypher feature: {feature}"))]
UnsupportedFeature { feature: String, location: Location },
#[snafu(display("Invalid graph pattern: {message}"))]
InvalidPattern { message: String, location: Location },
#[snafu(display("DataFusion error: {source}"))]
DataFusion {
source: datafusion_common::DataFusionError,
location: Location,
},
#[snafu(display("Lance core error: {source}"))]
LanceCore {
source: lance::Error,
location: Location,
},
#[snafu(display("Arrow error: {source}"))]
Arrow {
source: arrow::error::ArrowError,
location: Location,
},
}
impl From<datafusion_common::DataFusionError> for GraphError {
fn from(source: datafusion_common::DataFusionError) -> Self {
Self::DataFusion {
source,
location: Location::new(file!(), line!(), column!()),
}
}
}
impl From<lance::Error> for GraphError {
fn from(source: lance::Error) -> Self {
Self::LanceCore {
source,
location: Location::new(file!(), line!(), column!()),
}
}
}
impl From<arrow::error::ArrowError> for GraphError {
fn from(source: arrow::error::ArrowError) -> Self {
Self::Arrow {
source,
location: Location::new(file!(), line!(), column!()),
}
}
}