net_agent_api/api/
data_packet.rs

1use ion_rs;
2
3use ion_rs::IonReader;
4use ion_rs::IonType;
5use ion_rs::IonWriter;
6
7use ion_rs::ReaderBuilder;
8
9use net_core_api::core::api::API;
10use net_core_api::core::encoder_api::Encoder;
11use net_core_api::core::decoder_api::Decoder;
12use net_core_api::core::typed_api::Typed;
13
14
15const DATA_TYPE: &str = "data_packet";
16
17#[derive(Debug, PartialEq, Eq, Clone)]
18pub struct DataPacketDTO {
19    data: Vec<u8>
20}
21impl API for DataPacketDTO { }
22
23impl DataPacketDTO {
24    pub fn new (data: &[u8]) -> Self {
25        DataPacketDTO {
26            data: data.into()
27        }
28    }
29
30    pub fn get_data(&self) -> &[u8] {
31        &self.data
32    }
33}
34
35impl Encoder for DataPacketDTO {
36    fn encode(&self) -> Vec<u8> {
37        let buffer: Vec<u8> = Vec::new();
38
39        let binary_writer_builder = ion_rs::BinaryWriterBuilder::new();
40        
41        let mut writer = binary_writer_builder.build(buffer.clone()).unwrap();
42        
43        writer.step_in(IonType::Struct).expect("Error while creating an ion struct");
44
45        writer.set_field_name("data");
46        writer.write_blob(&self.data).unwrap();
47
48        writer.step_out().unwrap();
49        writer.flush().unwrap();
50
51        writer.output().as_slice().into()
52    }
53}
54
55impl Decoder for DataPacketDTO {
56    fn decode(data: &[u8]) -> Self {
57
58        let mut binary_user_reader = ReaderBuilder::new().build(data).unwrap();
59        binary_user_reader.next().unwrap();
60        binary_user_reader.step_in().unwrap();
61
62        binary_user_reader.next().unwrap();
63        let binding = binary_user_reader.read_blob().unwrap();
64        let data = binding.as_slice();
65
66        DataPacketDTO::new(
67            data
68        )
69    }
70}
71
72impl Typed for DataPacketDTO {
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
83#[cfg(test)]
84mod tests {
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::decoder_api::Decoder;
91    use net_core_api::core::encoder_api::Encoder;
92    use net_core_api::core::typed_api::Typed;
93
94
95    use crate::api::data_packet::DataPacketDTO;
96
97    #[test]
98    fn reader_correctly_read_encoded_data_packet() {
99        const DATA: &[u8] = "SOME_RAW_PCAP".as_bytes();
100        let data_packet: DataPacketDTO = DataPacketDTO::new(DATA);
101        let mut binary_user_reader = ReaderBuilder::new().build(data_packet.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::Blob), binary_user_reader.next().unwrap());
107        assert_eq!("data", binary_user_reader.field_name().unwrap());
108        assert_eq!(DATA, binary_user_reader.read_blob().unwrap().as_slice());
109    }
110
111    #[test]
112    fn endec_data_packet() {
113        const DATA: &[u8] = "SOME_RAW_PCAP".as_bytes();
114        let data_packet: DataPacketDTO = DataPacketDTO::new(DATA);
115        assert_eq!(data_packet, DataPacketDTO::decode(&data_packet.encode()));
116    }
117
118    #[test]
119    fn test_getting_data_types() {
120        const DATA: &[u8] = "SOME_RAW_PCAP".as_bytes();
121        let data_packet: DataPacketDTO = DataPacketDTO::new(DATA);
122        assert_eq!(data_packet.get_type(), DataPacketDTO::get_data_type());
123        assert_eq!(data_packet.get_type(), super::DATA_TYPE);
124    }
125}