1use std::collections::HashMap;
2use std::fmt::{Display, Formatter};
3use std::str::FromStr;
4
5use crate::edge::Edge;
6use crate::id::EmptyId;
7use crate::node::GenericNodeInfo;
8use crate::node::Node;
9use crate::EdgeId;
10use crate::NodeId;
11
12use serde::{Deserialize, Deserializer, Serialize, Serializer};
13use serde_json;
14use thiserror::Error;
15
16#[derive(Debug, Error)]
17pub enum JsonCanvasError {
18 #[error("Node {0} already exists")]
19 NodeExists(NodeId),
20 #[error("Edge {0} already exists")]
21 EdgeExists(EdgeId),
22 #[error("Node {0} does not exist")]
23 NodeNotExists(NodeId),
24 #[error(transparent)]
25 ParseError(#[from] serde_json::Error),
26 #[error(transparent)]
27 EmptyId(#[from] EmptyId),
28}
29
30#[derive(Debug, Serialize, Deserialize, Default)]
35pub struct JsonCanvas {
36 #[serde(
37 serialize_with = "serialize_as_vec_node",
38 deserialize_with = "deserialize_as_map_node"
39 )]
40 #[serde(skip_serializing_if = "HashMap::is_empty", default)]
41 nodes: HashMap<NodeId, Node>,
42 #[serde(
43 serialize_with = "serialize_as_vec_edge",
44 deserialize_with = "deserialize_as_map_edge"
45 )]
46 #[serde(skip_serializing_if = "HashMap::is_empty", default)]
47 edges: HashMap<EdgeId, Edge>,
48}
49fn serialize_as_vec_node<S>(data: &HashMap<NodeId, Node>, serializer: S) -> Result<S::Ok, S::Error>
50where
51 S: Serializer,
52{
53 let vec: Vec<&Node> = data.values().collect();
54 vec.serialize(serializer)
55}
56
57fn deserialize_as_map_node<'de, D>(deserializer: D) -> Result<HashMap<NodeId, Node>, D::Error>
58where
59 D: Deserializer<'de>,
60{
61 let vec: Vec<Node> = Vec::deserialize(deserializer)?;
62 let map: HashMap<_, _> = vec
63 .into_iter()
64 .map(|node| (node.id().clone(), node))
65 .collect();
66 Ok(map)
67}
68
69fn serialize_as_vec_edge<S>(data: &HashMap<EdgeId, Edge>, serializer: S) -> Result<S::Ok, S::Error>
70where
71 S: Serializer,
72{
73 let vec: Vec<&Edge> = data.values().collect();
74 vec.serialize(serializer)
75}
76
77fn deserialize_as_map_edge<'de, D>(deserializer: D) -> Result<HashMap<EdgeId, Edge>, D::Error>
78where
79 D: Deserializer<'de>,
80{
81 let vec: Vec<Edge> = Vec::deserialize(deserializer)?;
82 let map: HashMap<_, _> = vec
83 .into_iter()
84 .map(|node| (node.id().clone(), node))
85 .collect();
86 Ok(map)
87}
88
89impl JsonCanvas {
90 pub fn add_node(&mut self, node: Node) -> Result<(), JsonCanvasError> {
91 if self.nodes.contains_key(node.id()) {
92 return Err(JsonCanvasError::NodeExists(node.id().clone()));
93 }
94 self.nodes.insert(node.id().clone(), node);
95 Ok(())
96 }
97
98 pub fn add_edge(&mut self, edge: Edge) -> Result<(), JsonCanvasError> {
99 if self.edges.contains_key(edge.id()) {
100 return Err(JsonCanvasError::EdgeExists(edge.id().clone()));
101 }
102
103 if !self.nodes.contains_key(edge.from_node()) {
104 return Err(JsonCanvasError::NodeNotExists(edge.from_node().clone()));
105 }
106
107 if !self.nodes.contains_key(edge.to_node()) {
108 return Err(JsonCanvasError::NodeNotExists(edge.to_node().clone()));
109 }
110
111 self.edges.insert(edge.id().clone(), edge);
112 Ok(())
113 }
114
115 pub fn get_node(&mut self, id: NodeId) -> Option<&mut Node> {
116 self.nodes.get_mut(&id)
117 }
118
119 pub fn get_edge(&mut self, id: EdgeId) -> Option<&mut Edge> {
120 self.edges.get_mut(&id)
121 }
122
123 pub fn get_nodes(&self) -> &HashMap<NodeId, Node> {
124 &self.nodes
125 }
126
127 pub fn get_mut_nodes(&mut self) -> &mut HashMap<NodeId, Node> {
128 &mut self.nodes
129 }
130
131 pub fn get_edges(&self) -> &HashMap<EdgeId, Edge> {
132 &self.edges
133 }
134
135 pub fn get_mut_edges(&mut self) -> &mut HashMap<EdgeId, Edge> {
136 &mut self.edges
137 }
138}
139
140impl FromStr for JsonCanvas {
141 type Err = JsonCanvasError;
142
143 fn from_str(s: &str) -> Result<Self, Self::Err> {
144 Ok(serde_json::from_str(s)?)
145 }
146}
147
148impl Display for JsonCanvas {
149 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
150 write!(f, "{}", serde_json::to_string(self).unwrap())
151 }
152}