net_updater_api/api/updaters/update_packet/
update_packet_request.rs1use ion_rs;
2
3use ion_rs::IonReader;
4use ion_rs::IonType;
5use ion_rs::IonWriter;
6
7use ion_rs::ReaderBuilder;
8
9use ion_rs::StreamItem;
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 = "update-network-request";
16
17#[derive(Debug, PartialEq, Eq)]
18pub struct UpdatePacketRequestDTO {
19 id: String,
20 network_id: Option<String>,
21}
22impl API for UpdatePacketRequestDTO { }
23
24impl UpdatePacketRequestDTO {
25 pub fn new(
26 id: &str,
27 network_id: Option<&str>,
28 ) -> Self {
29 UpdatePacketRequestDTO {
30 id: id.into(),
31 network_id: network_id.map(str::to_string),
32 }
33 }
34
35 pub fn get_id(&self) -> &str {
36 &self.id
37 }
38
39 pub fn get_network_id(&self) -> Option<&str> {
40 self.network_id.as_deref()
41 }
42}
43
44impl Encoder for UpdatePacketRequestDTO {
45 fn encode(&self) -> Vec<u8> {
46 let buffer: Vec<u8> = Vec::new();
47
48 let binary_writer_builder = ion_rs::BinaryWriterBuilder::new();
49 let mut writer = binary_writer_builder.build(buffer.clone()).unwrap();
50
51 writer.step_in(IonType::Struct).expect("Error while creating an ion struct");
52
53 writer.set_field_name("id");
54 writer.write_string(&self.id).unwrap();
55
56 writer.set_field_name("network_id");
57 match self.network_id.as_deref() {
58 Some(network_id) => writer.write_string(network_id).unwrap(),
59 None => writer.write_null(IonType::String).unwrap(),
60 }
61
62 writer.step_out().unwrap();
63 writer.flush().unwrap();
64
65 writer.output().as_slice().into()
66 }
67}
68
69impl Decoder for UpdatePacketRequestDTO {
70 fn decode(data: &[u8]) -> Self {
71 let mut binary_user_reader = ReaderBuilder::new().build(data).unwrap();
72 binary_user_reader.next().unwrap();
73 binary_user_reader.step_in().unwrap();
74
75 binary_user_reader.next().unwrap();
76 let binding = binary_user_reader.read_string().unwrap();
77 let id = binding.text();
78
79 binary_user_reader.next().unwrap();
80 let network_id = match binary_user_reader.current() {
81 StreamItem::Value(_) => Some(binary_user_reader.read_string().unwrap().text().to_string()),
82 _ => None,
83 };
84
85 UpdatePacketRequestDTO::new(
86 id,
87 network_id.as_deref(),
88 )
89 }
90}
91
92impl Typed for UpdatePacketRequestDTO {
93 fn get_data_type() -> &'static str {
94 DATA_TYPE
95 }
96
97 fn get_type(&self) -> &str {
98 Self::get_data_type()
99 }
100}
101
102#[cfg(test)]
103mod tests {
104 use ion_rs::IonType;
105 use ion_rs::IonReader;
106 use ion_rs::ReaderBuilder;
107 use ion_rs::StreamItem;
108
109 use net_core_api::core::encoder_api::Encoder;
110 use net_core_api::core::decoder_api::Decoder;
111
112 use crate::api::updaters::update_packet::update_packet_request::UpdatePacketRequestDTO;
113
114 #[test]
115 fn reader_correctly_read_encoded_update_pcap_request() {
116 const ID: &str = "1";
117 const NETWORK_ID: Option<&str> = Some("2");
118 let update_pcap_request = UpdatePacketRequestDTO::new(
119 ID,
120 NETWORK_ID
121 );
122 let mut binary_user_reader = ReaderBuilder::new().build(update_pcap_request.encode()).unwrap();
123
124 assert_eq!(StreamItem::Value(IonType::Struct), binary_user_reader.next().unwrap());
125 binary_user_reader.step_in().unwrap();
126
127 assert_eq!(StreamItem::Value(IonType::String), binary_user_reader.next().unwrap());
128 assert_eq!("id", binary_user_reader.field_name().unwrap());
129 assert_eq!(ID, binary_user_reader.read_string().unwrap().text());
130
131 assert_eq!(StreamItem::Value(IonType::String), binary_user_reader.next().unwrap());
132 assert_eq!("network_id", binary_user_reader.field_name().unwrap());
133 assert_eq!(NETWORK_ID.unwrap(), binary_user_reader.read_string().unwrap().text());
134
135 binary_user_reader.step_out().unwrap();
136 }
137
138 #[test]
139 fn endec_update_pcap_request_some_network() {
140 const ID: &str = "1";
141 const NETWORK_ID: Option<&str> = Some("2");
142 let update_pcap_request = UpdatePacketRequestDTO::new(
143 ID,
144 NETWORK_ID
145 );
146
147 assert_eq!(update_pcap_request, UpdatePacketRequestDTO::decode(&update_pcap_request.encode()));
148 }
149
150 #[test]
151 fn endec_update_pcap_request_none_network() {
152 const ID: &str = "1";
153 const NETWORK_ID: Option<&str> = Some("2");
154 let update_pcap_request = UpdatePacketRequestDTO::new(
155 ID,
156 NETWORK_ID
157 );
158
159 assert_eq!(update_pcap_request, UpdatePacketRequestDTO::decode(&update_pcap_request.encode()));
160 }
161}