net_reporter_api/api/network_graph/
graph_node.rs

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