net_reporter_api/api/network_packet/
network_packets_request.rs

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