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