kproc_values/
graph.rs

1//! Graph module
2
3use std::collections::HashMap;
4
5#[cfg(feature = "schemars")]
6use schemars::JsonSchema;
7
8use crate::Value;
9
10/// Encoded graph
11#[derive(Debug, serde::Serialize, serde::Deserialize, Clone)]
12#[cfg_attr(feature = "schemars", derive(JsonSchema))]
13pub struct EncodedGraph
14{
15  /// List of nodes in the graph (varname, label, properties)
16  pub nodes: Vec<(String, String, HashMap<String, Value>)>,
17  /// List of relationships in the graph (source,destination,label, properties) source/destination must match a varname in nodes.
18  pub relationships: Vec<(String, String, String, HashMap<String, Value>)>,
19}
20
21impl EncodedGraph {}
22
23#[cfg(test)]
24mod tests
25{
26  use super::EncodedGraph;
27
28  #[test]
29  fn test_deserialization()
30  {
31    let eg: EncodedGraph = serde_json::from_str(
32            r#"{
33                "nodes": [["paul", "Person", {"age": 32, "occupation": "software engineer", "name": "Paul"}], ["josh", "Person", {"occupation": "chef", "name": "Josh"}], ["liu_wang", "Person", {"age": 40, "name": "Liu Wang"}], ["blue_dragon", "Restaurant", {}]],
34                "relationships": [["paul", "is_friend_of", "liu_wang", {}], ["josh", "works_at", "blue_dragon", {}], ["paul", "boyfriend", "josh", {}]]
35            }"#,
36        ).unwrap();
37    assert_eq!(eg.nodes.len(), 4);
38    assert_eq!(eg.relationships.len(), 3);
39  }
40  #[test]
41  fn test_serialization()
42  {
43    let eg: EncodedGraph = serde_json::from_str(
44            r#"{
45                "nodes": [["paul", "Person", {"name": "Paul"}], ["josh", "Person", {"name": "Josh"}], ["liu_wang", "Person", {"name": "Liu Wang"}], ["blue_dragon", "Restaurant", {}]],
46                "relationships": [["paul", "is_friend_of", "liu_wang", {}], ["josh", "works_at", "blue_dragon", {}], ["paul", "boyfriend", "josh", {}]]
47            }"#,
48        ).unwrap();
49    let txt = serde_json::to_string(&eg).unwrap();
50    assert_eq!(
51      txt,
52      r#"{"nodes":[["paul","Person",{"name":"Paul"}],["josh","Person",{"name":"Josh"}],["liu_wang","Person",{"name":"Liu Wang"}],["blue_dragon","Restaurant",{}]],"relationships":[["paul","is_friend_of","liu_wang",{}],["josh","works_at","blue_dragon",{}],["paul","boyfriend","josh",{}]]}"#
53    );
54  }
55}