grapl_graph_descriptions/
dynamic_node.rs1use log::warn;
2use serde_json::{json, Value};
3
4use crate::graph_description::{id_strategy, node_property, DynamicNode, IdStrategy, NodeProperty};
5use crate::node::NodeT;
6
7impl DynamicNode {
8 pub fn set_property(&mut self, name: impl Into<String>, value: impl Into<NodeProperty>) {
9 self.properties.insert(name.into(), value.into().into());
10 }
11
12 pub fn set_key(&mut self, key: String) {
13 self.node_key = key;
14 }
15
16 pub fn into_json(self) -> Value {
17 let mut j = json!({
18 "node_key": self.node_key,
19 "dgraph.type": self.node_type,
20 "seen_at": self.seen_at,
21 });
22
23 if let Some(asset_id) = self.asset_id {
24 j["asset_id"] = asset_id.into();
25 }
26
27 for (key, prop) in self.properties {
28 let prop = match prop.property {
29 Some(node_property::Property::Intprop(i)) => Value::from(i),
30 Some(node_property::Property::Uintprop(i)) => Value::from(i),
31 Some(node_property::Property::Strprop(s)) => Value::from(s),
32 None => panic!("Invalid property on DynamicNode: {}", self.node_key),
33 };
34
35 j[key] = prop;
36 }
37
38 j
39 }
40
41 pub fn get_id_strategies(&self) -> &[IdStrategy] {
42 &self.id_strategy[..]
43 }
44
45 pub fn requires_asset_identification(&self) -> bool {
46 for strategy in self.get_id_strategies() {
47 match strategy.strategy.as_ref().unwrap() {
48 id_strategy::Strategy::Session(ref strategy) => {
49 if strategy.primary_key_requires_asset_id {
50 return true;
51 }
52 }
53 id_strategy::Strategy::Static(ref strategy) => {
54 if strategy.primary_key_requires_asset_id {
55 return true;
56 }
57 }
58 }
59 }
60
61 false
62 }
63}
64
65impl NodeT for DynamicNode {
66 fn get_asset_id(&self) -> Option<&str> {
67 self.asset_id.as_ref().map(String::as_str)
68 }
69
70 fn set_asset_id(&mut self, asset_id: impl Into<String>) {
71 self.asset_id = Some(asset_id.into());
72 }
73
74 fn get_node_key(&self) -> &str {
75 self.node_key.as_str()
76 }
77
78 fn set_node_key(&mut self, node_key: impl Into<String>) {
79 self.node_key = node_key.into();
80 }
81
82 fn merge(&mut self, other: &Self) -> bool {
83 if self.node_key != other.node_key {
84 warn!("Attempted to merge two NetworkConnection Nodes with differing node_keys");
85 return false;
86 }
87
88 let mut merged = false;
89
90 for (key, prop) in other.properties.clone() {
91 let inserted = self.properties.insert(key, prop);
92 if inserted.is_some() {
93 merged = true;
94 }
95 }
96
97 merged
98 }
99
100 fn merge_into(&mut self, other: Self) -> bool {
101 if self.node_key != other.node_key {
102 warn!("Attempted to merge two NetworkConnection Nodes with differing node_keys");
103 return false;
104 }
105
106 let mut merged = false;
107
108 for (key, prop) in other.properties.into_iter() {
109 let inserted = self.properties.insert(key, prop);
110 if inserted.is_some() {
111 merged = true;
112 }
113 }
114
115 merged
116 }
117}