net_reporter_api/api/network_graph/
graph_node.rs1use ion_rs;
2
3use ion_rs::IonReader;
4use ion_rs::IonType;
5use ion_rs::IonWriter;
6use ion_rs::ReaderBuilder;
7
8use net_core_api::core::api::API;
9use net_core_api::core::encoder_api::Encoder;
10use net_core_api::core::decoder_api::Decoder;
11use net_core_api::core::typed_api::Typed;
12
13
14const DATA_TYPE: &str = "graph_node";
15
16#[derive(Debug, PartialEq, Eq, Clone)]
17pub struct GraphNodeDTO {
18 node_id: String,
19}
20impl API for GraphNodeDTO { }
21
22impl GraphNodeDTO {
23 pub fn new(node_id: &str) -> Self {
24 GraphNodeDTO { node_id: node_id.into() }
25 }
26
27 pub fn get_node_id(&self) -> &str {
28 &self.node_id
29 }
30}
31
32impl Encoder for GraphNodeDTO {
33 fn encode(&self) -> Vec<u8> {
34 let buffer: Vec<u8> = Vec::new();
35
36 let binary_writer_builder = ion_rs::BinaryWriterBuilder::new();
37 let mut writer = binary_writer_builder.build(buffer.clone()).unwrap();
38
39 writer.step_in(IonType::Struct).expect("Error while creating an ion struct");
40
41 writer.set_field_name("node_id");
42 writer.write_string(&self.node_id).unwrap();
43
44 writer.step_out().unwrap();
45 writer.flush().unwrap();
46
47 writer.output().as_slice().into()
48 }
49}
50
51impl Decoder for GraphNodeDTO {
52 fn decode(data: &[u8]) -> Self {
53
54 let mut binary_user_reader = ReaderBuilder::new().build(data).unwrap();
55 binary_user_reader.next().unwrap();
56 binary_user_reader.step_in().unwrap();
57
58 binary_user_reader.next().unwrap();
59 let binding = binary_user_reader.read_string().unwrap();
60 let node_id = binding.text();
61
62 GraphNodeDTO::new(node_id)
63 }
64}
65
66impl Typed for GraphNodeDTO {
67 fn get_data_type() -> &'static str {
68 DATA_TYPE
69 }
70
71 fn get_type(&self) -> &str {
72 Self::get_data_type()
73 }
74}
75
76
77#[cfg(test)]
78mod tests {
79 use ion_rs::IonType;
80 use ion_rs::IonReader;
81 use ion_rs::ReaderBuilder;
82 use ion_rs::StreamItem;
83
84 use net_core_api::core::encoder_api::Encoder;
85 use net_core_api::core::decoder_api::Decoder;
86 use net_core_api::core::typed_api::Typed;
87
88 use crate::api::network_graph::graph_node::GraphNodeDTO;
89
90
91 #[test]
92 fn reader_correctly_read_encoded_graph_node() {
93 const NODE_ID: &str = "0.0.0.0:0000";
94
95 let graph_node = GraphNodeDTO::new(NODE_ID);
96 let mut binary_user_reader = ReaderBuilder::new().build(graph_node.encode()).unwrap();
97
98 assert_eq!(StreamItem::Value(IonType::Struct), binary_user_reader.next().unwrap());
99 binary_user_reader.step_in().unwrap();
100
101 assert_eq!(StreamItem::Value(IonType::String), binary_user_reader.next().unwrap());
102 assert_eq!("node_id", binary_user_reader.field_name().unwrap());
103 assert_eq!(NODE_ID, binary_user_reader.read_string().unwrap().text());
104 }
105
106 #[test]
107 fn endec_graph_node() {
108 const NODE_ID: &str = "0.0.0.0:0000";
109
110 let graph_node = GraphNodeDTO::new(NODE_ID);
111 assert_eq!(graph_node, GraphNodeDTO::decode(&graph_node.encode()));
112 }
113
114 #[test]
115 fn test_getting_data_types() {
116 const NODE_ID: &str = "0.0.0.0:0000";
117
118 let graph_node = GraphNodeDTO::new(NODE_ID);
119 assert_eq!(graph_node.get_type(), GraphNodeDTO::get_data_type());
120 assert_eq!(graph_node.get_type(), super::DATA_TYPE);
121 }
122}