grapl_graph_descriptions/
dynamic_node.rs

1use 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}