1use snafu::{ResultExt, Snafu};
12
13pub use crate::{
14 Edge, EdgeStore, EdgeStoreData, HasEdgeStore, HasNodeStore, Meta, Metadata, Node, NodeStore,
15 NodeStoreData,
16};
17
18#[derive(Clone, Debug, Snafu)]
20#[snafu(visibility(pub(crate)))]
21pub enum Error {
22 NodeStore { source: crate::node::NodeStoreError },
24 EdgeStore { source: crate::edge::EdgeStoreError },
26}
27
28#[derive(Clone, Debug, Default, PartialEq)]
30#[cfg_attr(
31 feature = "serde",
32 derive(serde::Serialize, serde::Deserialize),
33 serde(default)
34)]
35pub struct Graph {
36 pub metadata: Metadata,
38 pub nodes: NodeStoreData,
40 pub edges: EdgeStoreData,
42}
43
44impl HasNodeStore for Graph {
45 fn node_store(&self) -> &NodeStoreData {
46 &self.nodes
47 }
48 fn node_store_mut(&mut self) -> &mut NodeStoreData {
49 &mut self.nodes
50 }
51}
52impl NodeStore for Graph {}
53impl HasEdgeStore for Graph {
54 fn edge_store(&self) -> &EdgeStoreData {
55 &self.edges
56 }
57 fn edge_store_mut(&mut self) -> &mut EdgeStoreData {
58 &mut self.edges
59 }
60}
61impl EdgeStore for Graph {}
62
63impl Graph {
64 pub fn new(
65 metadata: Option<Metadata>,
66 nodes: Vec<Node>,
67 edges: Vec<Edge>,
68 ) -> Result<Self, Error> {
69 let mut node_store = NodeStoreData::default();
70 node_store
71 .extend_nodes(nodes, true)
72 .with_context(|_| NodeStoreSnafu)?;
73 let mut edge_store = EdgeStoreData::default();
74 edge_store
75 .extend_edges(edges, true, Some(&node_store))
76 .with_context(|_| EdgeStoreSnafu)?;
77 let graph = Self {
78 metadata: metadata.unwrap_or_default(),
79 nodes: node_store,
80 edges: edge_store,
81 };
82 Ok(graph)
83 }
84}
85
86impl Meta for Graph {
87 fn get_meta(&self) -> &Metadata {
88 &self.metadata
89 }
90}