use std::fmt::Debug;
#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum Error {
#[cfg(feature = "graph")]
#[error(transparent)]
Graph(#[from] crate::graph::graph::GraphError),
#[cfg(feature = "hgraph")]
#[error(transparent)]
HGraph(#[from] crate::hgraph::h_graph::HGraphError),
#[error(transparent)]
Traversal(#[from] crate::core::TraversalError),
#[error(transparent)]
ShortestPath(#[from] crate::core::ShortestPathError),
#[error(transparent)]
Centrality(#[from] crate::core::CentralityError),
#[cfg(feature = "community")]
#[error(transparent)]
CommunityDetection(#[from] crate::core::CommunityDetectionError),
#[cfg(feature = "graph")]
#[error(transparent)]
GraphConversion(#[from] crate::graph::conversion::graph_conversion::GraphConversionError),
#[cfg(feature = "hgraph")]
#[error(transparent)]
HGraphConversion(#[from] crate::hgraph::conversion::h_graph_conversion::GraphConversionError),
#[cfg(feature = "hgraph")]
#[error(transparent)]
Csv(#[from] crate::hgraph::io::hcsv_io::CsvIoError),
#[error(transparent)]
Io(#[from] std::io::Error),
}
pub type Result<T> = std::result::Result<T, Error>;
#[cfg(test)]
#[cfg(feature = "graph")]
mod tests {
use super::*;
use crate::core::{NodeId, ShortestPath, Traversal};
use crate::graph::Graph;
fn analyse() -> Result<usize> {
let mut graph = Graph::<u32, u32, ()>::new(false);
let a = graph.add_node(0);
let b = graph.add_node(1);
graph.add_edge(a, b, 1, ())?;
let reachable = graph.reachable_from(a)?;
let distances = graph.dijkstra(a)?;
Ok(reachable.len() + distances.len())
}
#[test]
fn test_unrelated_errors_share_one_type() {
assert_eq!(analyse().unwrap(), 4);
}
#[test]
fn test_each_error_keeps_its_own_message() {
let graph = Graph::<u32, u32, ()>::new(false);
let error: Error = graph
.reachable_from(NodeId::from_index(7))
.unwrap_err()
.into();
assert_eq!(
error.to_string(),
"Invalid node reference: node ID 7 not found"
);
}
}