net_reporter_api/api/network_graph/
network_graph_request.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
13use super::network_graph_filters::NetworkGraphFiltersDTO;
14
15const DATA_TYPE: &str = "network-graph-request";
16
17#[derive(Debug, PartialEq, Eq)]
18pub struct NetworkGraphRequestDTO {
19 start_date_time: i64,
20 end_date_time: i64,
21 network_id: Option<String>,
22 filters: NetworkGraphFiltersDTO,
23}
24impl API for NetworkGraphRequestDTO { }
25
26impl NetworkGraphRequestDTO {
27 pub fn new(start_date_time: i64, end_date_time: i64, network_id: Option<&str>, filters: NetworkGraphFiltersDTO) -> Self {
28 NetworkGraphRequestDTO {
29 start_date_time,
30 end_date_time,
31 network_id: network_id.map(str::to_string),
32 filters,
33 }
34 }
35
36 pub fn get_start_date_time(&self) -> i64 {
37 self.start_date_time
38 }
39
40 pub fn get_end_date_time(&self) -> i64 {
41 self.end_date_time
42 }
43
44 pub fn get_network_id(&self) -> Option<&str> {
45 self.network_id.as_deref()
46 }
47
48 pub fn get_filters(&self) -> &NetworkGraphFiltersDTO {
49 &self.filters
50 }
51}
52
53impl Encoder for NetworkGraphRequestDTO {
54 fn encode(&self) -> Vec<u8> {
55 let buffer: Vec<u8> = Vec::new();
56
57 let binary_writer_builder = ion_rs::BinaryWriterBuilder::new();
58 let mut writer = binary_writer_builder.build(buffer.clone()).unwrap();
59
60 writer.step_in(IonType::Struct).expect("Error while creating an ion struct");
61
62 writer.set_field_name("start_date_time");
63 writer.write_i64(self.start_date_time).unwrap();
64
65 writer.set_field_name("end_date_time");
66 writer.write_i64(self.end_date_time).unwrap();
67
68 writer.set_field_name("network_id");
69 match self.network_id.as_deref() {
70 Some(network_id) => writer.write_string(network_id).unwrap(),
71 None => writer.write_null(IonType::String).unwrap(),
72 }
73
74 writer.set_field_name("filters");
75 writer.write_blob(self.filters.encode().as_slice()).unwrap();
76
77 writer.step_out().unwrap();
78 writer.flush().unwrap();
79
80 writer.output().as_slice().into()
81 }
82}
83
84impl Decoder for NetworkGraphRequestDTO {
85 fn decode(data: &[u8]) -> Self {
86
87 let mut binary_user_reader = ReaderBuilder::new().build(data).unwrap();
88 binary_user_reader.next().unwrap();
89 binary_user_reader.step_in().unwrap();
90
91 binary_user_reader.next().unwrap();
92 let start_date_time = binary_user_reader.read_i64().unwrap();
93
94 binary_user_reader.next().unwrap();
95 let end_date_time = binary_user_reader.read_i64().unwrap();
96
97 binary_user_reader.next().unwrap();
98 let network_id = match binary_user_reader.current() {
99 ion_rs::StreamItem::Value(_) => Some(binary_user_reader.read_string().unwrap().text().to_owned()),
100 _ => None,
101 };
102
103 binary_user_reader.next().unwrap();
104 let filters = NetworkGraphFiltersDTO::decode(binary_user_reader.read_blob().unwrap().as_slice());
105
106 NetworkGraphRequestDTO::new(
107 start_date_time,
108 end_date_time,
109 network_id.as_deref(),
110 filters
111 )
112 }
113}
114
115impl Typed for NetworkGraphRequestDTO {
116 fn get_data_type() -> &'static str {
117 DATA_TYPE
118 }
119
120 fn get_type(&self) -> &str {
121 Self::get_data_type()
122 }
123}
124
125#[cfg(test)]
126mod tests {
127 use ion_rs::IonType;
128 use ion_rs::IonReader;
129 use ion_rs::ReaderBuilder;
130 use ion_rs::StreamItem;
131
132 use net_core_api::core::encoder_api::Encoder;
133 use net_core_api::core::decoder_api::Decoder;
134 use net_core_api::core::typed_api::Typed;
135
136 use crate::api::network_graph::network_graph_filters::NetworkGraphFiltersDTO;
137 use crate::api::network_graph::network_graph_request::NetworkGraphRequestDTO;
138
139 fn get_test_filters() -> NetworkGraphFiltersDTO {
140 let protocols = vec!["TCP".to_string(), "UDP".to_string()];
141 const INCLUDE_PROTOCOLS_MODE: bool = false;
142 let endpoints = vec!["0.0.0.0".to_string(), "1.1.1.1".to_string()];
143 const INCLUDE_ENDPOINTS_MODE: bool = true;
144 let bytes_lower_bound = Some(100);
145 let bytes_upper_bound = Some(1000);
146
147 NetworkGraphFiltersDTO::new(
148 &protocols,
149 Some(INCLUDE_PROTOCOLS_MODE),
150 &endpoints,
151 Some(INCLUDE_ENDPOINTS_MODE),
152 bytes_lower_bound,
153 bytes_upper_bound
154 )
155 }
156
157 #[test]
158 fn reader_correctly_read_encoded_ng_request() {
159 const START_DATE_TIME: i64 = i64::MIN;
160 const END_DATE_TIME: i64 = i64::MAX;
161 const NETWORK_ID: &str = "1";
162
163 let network_graph_request = NetworkGraphRequestDTO::new(
164 START_DATE_TIME,
165 END_DATE_TIME,
166 Some(NETWORK_ID),
167 get_test_filters(),
168 );
169
170 let mut binary_user_reader = ReaderBuilder::new().build(network_graph_request.encode()).unwrap();
171
172 assert_eq!(StreamItem::Value(IonType::Struct), binary_user_reader.next().unwrap());
173 binary_user_reader.step_in().unwrap();
174
175 assert_eq!(StreamItem::Value(IonType::Int), binary_user_reader.next().unwrap());
176 assert_eq!("start_date_time", binary_user_reader.field_name().unwrap());
177 assert_eq!(START_DATE_TIME, binary_user_reader.read_i64().unwrap());
178
179 assert_eq!(StreamItem::Value(IonType::Int), binary_user_reader.next().unwrap());
180 assert_eq!("end_date_time", binary_user_reader.field_name().unwrap());
181 assert_eq!(END_DATE_TIME, binary_user_reader.read_i64().unwrap());
182
183 assert_eq!(StreamItem::Value(IonType::String), binary_user_reader.next().unwrap());
184 assert_eq!("network_id", binary_user_reader.field_name().unwrap());
185 assert_eq!(NETWORK_ID, binary_user_reader.read_string().unwrap().text());
186
187 assert_eq!(StreamItem::Value(IonType::Blob), binary_user_reader.next().unwrap());
188 assert_eq!("filters", binary_user_reader.field_name().unwrap());
189 assert_eq!(get_test_filters(), NetworkGraphFiltersDTO::decode(binary_user_reader.read_blob().unwrap().as_slice()));
190 }
191
192 #[test]
193 fn endec_ng_request() {
194 const START_DATE_TIME: i64 = i64::MIN;
195 const END_DATE_TIME: i64 = i64::MAX;
196 const NETWORK_ID: &str = "1";
197
198 let network_graph_request = NetworkGraphRequestDTO::new(
199 START_DATE_TIME,
200 END_DATE_TIME,
201 Some(NETWORK_ID),
202 get_test_filters(),
203 );
204 assert_eq!(network_graph_request, NetworkGraphRequestDTO::decode(&network_graph_request.encode()));
205 }
206
207 #[test]
208 fn endec_ng_request_with_optional_network_id() {
209 const START_DATE_TIME: i64 = i64::MIN;
210 const END_DATE_TIME: i64 = i64::MAX;
211
212 let network_graph_request = NetworkGraphRequestDTO::new(
213 START_DATE_TIME,
214 END_DATE_TIME,
215 None,
216 get_test_filters(),
217 );
218 assert_eq!(network_graph_request, NetworkGraphRequestDTO::decode(&network_graph_request.encode()));
219 }
220
221 #[test]
222 fn test_getting_data_types() {
223 const START_DATE_TIME: i64 = i64::MIN;
224 const END_DATE_TIME: i64 = i64::MAX;
225 const NETWORK_ID: &str = "1";
226
227 let network_graph_request = NetworkGraphRequestDTO::new(
228 START_DATE_TIME,
229 END_DATE_TIME,
230 Some(NETWORK_ID),
231 get_test_filters(),
232 );
233 assert_eq!(network_graph_request.get_type(), NetworkGraphRequestDTO::get_data_type());
234 assert_eq!(network_graph_request.get_type(), super::DATA_TYPE);
235 }
236}