net_reporter_api/api/network_packet/
network_packets_request.rs1use ion_rs;
2
3use ion_rs::element::reader::ElementReader;
4use ion_rs::IonReader;
5use ion_rs::IonType;
6use ion_rs::IonWriter;
7
8use ion_rs::ReaderBuilder;
9
10use net_core_api::core::api::API;
11use net_core_api::core::encoder_api::Encoder;
12use net_core_api::core::decoder_api::Decoder;
13use net_core_api::core::typed_api::Typed;
14
15const DATA_TYPE: &str = "network-packet-request";
16
17#[derive(Debug, PartialEq, Eq, Clone)]
18pub struct NetworkPacketsRequestDTO {
19 packets_network_ids: Vec<Option<String>>,
20}
21impl API for NetworkPacketsRequestDTO { }
22
23impl NetworkPacketsRequestDTO {
24 pub fn new(packets_network_ids: &[Option<&str>]) -> Self {
25 NetworkPacketsRequestDTO {
26 packets_network_ids: packets_network_ids.iter().map(|id| id.map(str::to_string)).collect(),
27 }
28 }
29 pub fn get_network_ids(&self) -> &[Option<String>] {
30 self.packets_network_ids.as_slice()
31 }
32}
33
34impl Encoder for NetworkPacketsRequestDTO {
35 fn encode(&self) -> Vec<u8> {
36 let buffer: Vec<u8> = Vec::new();
37
38 let binary_writer_builder = ion_rs::BinaryWriterBuilder::new();
39 let mut writer = binary_writer_builder.build(buffer.clone()).unwrap();
40
41 writer.step_in(IonType::Struct).expect("Error while creating an ion struct");
42
43 writer.set_field_name("packets_network_ids");
44 writer.step_in(IonType::List).unwrap();
45 self.packets_network_ids.iter().for_each(|network_id|{
46 match network_id.as_ref() {
47 Some(id) => writer.write_string(id).unwrap(),
48 None => writer.write_null(IonType::String).unwrap(),
49 }
50 });
51 writer.step_out().unwrap();
52
53 writer.step_out().unwrap();
54 writer.flush().unwrap();
55
56 writer.output().as_slice().into()
57 }
58}
59
60impl Decoder for NetworkPacketsRequestDTO {
61 fn decode(data: &[u8]) -> Self {
62
63 let mut binary_user_reader = ReaderBuilder::new().build(data).unwrap();
64 binary_user_reader.next().unwrap();
65 binary_user_reader.step_in().unwrap();
66
67 binary_user_reader.next().unwrap();
68 binary_user_reader.step_in().unwrap();
69
70 let elements = binary_user_reader.read_all_elements().unwrap();
71 let ids: Vec<Option<&str>> = elements.iter().map(|element| element.as_text()).collect();
72
73 NetworkPacketsRequestDTO::new(ids.as_slice())
74 }
75}
76
77impl Typed for NetworkPacketsRequestDTO {
78 fn get_data_type() -> &'static str {
79 DATA_TYPE
80 }
81
82 fn get_type(&self) -> &str {
83 Self::get_data_type()
84 }
85}
86
87
88#[cfg(test)]
89mod tests {
90 use ion_rs::element::reader::ElementReader;
91 use ion_rs::IonType;
92 use ion_rs::IonReader;
93 use ion_rs::ReaderBuilder;
94 use ion_rs::StreamItem;
95
96 use net_core_api::core::encoder_api::Encoder;
97 use net_core_api::core::decoder_api::Decoder;
98 use net_core_api::core::typed_api::Typed;
99
100 use crate::api::network_packet::network_packets_request::NetworkPacketsRequestDTO;
101
102 #[test]
103 fn reader_correctly_read_encoded_network_packets_request() {
104 let test_network_ids = vec![Some("1"), Some("2"), None, None, Some("3")];
105 let network_packets_request = NetworkPacketsRequestDTO::new(test_network_ids.as_slice());
106 let mut binary_user_reader = ReaderBuilder::new().build(network_packets_request.encode()).unwrap();
107 assert_eq!(StreamItem::Value(IonType::Struct), binary_user_reader.next().unwrap());
108 binary_user_reader.step_in().unwrap();
109 assert_eq!(StreamItem::Value(IonType::List), binary_user_reader.next().unwrap());
110 assert_eq!("packets_network_ids", binary_user_reader.field_name().unwrap());
111 binary_user_reader.step_in().unwrap();
112 let elements = binary_user_reader.read_all_elements().unwrap();
113 for (element, id) in elements.iter().zip(test_network_ids.iter()) {
114 assert_eq!(element.as_text(), *id);
115 }
116 binary_user_reader.step_out().unwrap();
117 }
118
119 #[test]
120 fn endec_network_packet_request() {
121 let test_networks_ids = vec![Some("1"), Some("2"), None, None, Some("3")];
122 let network_packets_request = NetworkPacketsRequestDTO::new(test_networks_ids.as_slice());
123 assert_eq!(network_packets_request, NetworkPacketsRequestDTO::decode(&network_packets_request.encode()));
124 }
125
126 #[test]
127 fn test_getting_data_types() {
128 let test_network_ids = vec![Some("1"), Some("2"), None, None, Some("3")];
129 let network_packets_request = NetworkPacketsRequestDTO::new(test_network_ids.as_slice());
130 assert_eq!(network_packets_request.get_type(), NetworkPacketsRequestDTO::get_data_type());
131 assert_eq!(network_packets_request.get_type(), super::DATA_TYPE);
132 }
133}