net_deleter_api/api/
packets.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 = "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}