net_updater_api/api/updaters/update_packet/
update_packet_request.rs

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