net_reporter_api/api/http_responses/
http_response.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
14const DATA_TYPE: &str = "http_response";
15
16#[derive(Debug, PartialEq, Eq, Clone)]
17pub struct HttpResponseDTO {
18    date: i64,
19    client: String,
20    server: String,
21    response: i64,
22}
23impl API for HttpResponseDTO { }
24
25impl HttpResponseDTO {
26    pub fn new(date: i64, client: &str, server: &str, response: i64) -> Self {
27        HttpResponseDTO {
28            date,
29            client: client.to_string(),
30            server: server.to_string(),
31            response,
32        }
33    }
34
35    pub fn get_date(&self) -> i64 {
36        self.date
37    }
38
39    pub fn get_client(&self) -> &str {
40        &self.client
41    }
42
43    pub fn get_server(&self) -> &str {
44        &self.server
45    }
46
47    pub fn get_response(&self) -> i64 {
48        self.response
49    }
50}
51
52impl Encoder for HttpResponseDTO {
53    fn encode(&self) -> Vec<u8> {
54        let buffer: Vec<u8> = Vec::new();
55
56        let binary_writer_builder = ion_rs::BinaryWriterBuilder::new();
57        let mut writer = binary_writer_builder.build(buffer.clone()).unwrap();
58        
59        writer.step_in(IonType::Struct).expect("Error while creating an ion struct");
60        
61        writer.set_field_name("date");
62        writer.write_i64(self.date).unwrap();
63
64        writer.set_field_name("client");
65        writer.write_string(&self.client).unwrap();
66
67        writer.set_field_name("server");
68        writer.write_string(&self.server).unwrap();
69
70        writer.set_field_name("response");
71        writer.write_i64(self.response).unwrap();
72        
73        writer.step_out().unwrap();
74        writer.flush().unwrap();
75
76        writer.output().as_slice().into()
77    }
78}
79
80impl Decoder for HttpResponseDTO {
81    fn decode(data: &[u8]) -> Self {
82        let mut binary_user_reader = ReaderBuilder::new().build(data).unwrap();
83        binary_user_reader.next().unwrap();
84        binary_user_reader.step_in().unwrap();
85        
86        binary_user_reader.next().unwrap();
87        let date = binary_user_reader.read_i64().unwrap();
88
89        binary_user_reader.next().unwrap();
90        let binding = binary_user_reader.read_string().unwrap();
91        let client = binding.text();
92
93        binary_user_reader.next().unwrap();
94        let binding = binary_user_reader.read_string().unwrap();
95        let server = binding.text();
96
97        binary_user_reader.next().unwrap();
98        let response = binary_user_reader.read_i64().unwrap();
99
100        binary_user_reader.step_out().unwrap();
101
102        HttpResponseDTO::new(date, client, server, response)
103    }
104}
105
106impl Typed for HttpResponseDTO {
107    fn get_data_type() -> &'static str {
108        DATA_TYPE
109    }
110    fn get_type(&self) -> &str {
111        Self::get_data_type()
112    }
113}
114
115
116#[cfg(test)]
117mod tests {
118    use ion_rs::IonType;
119    use ion_rs::IonReader;
120    use ion_rs::ReaderBuilder;
121    use ion_rs::StreamItem;
122    
123    use net_core_api::core::encoder_api::Encoder;
124    use net_core_api::core::decoder_api::Decoder;
125
126    use crate::api::http_responses::http_response::HttpResponseDTO;
127
128    #[test]
129    fn reader_correctly_read_encoded_http_response() {
130        const BUCKET_TIMESTAMP: i64 = 123456789;
131        const CLIENT: &str = "0.0.0.0";
132        const SERVER: &str = "1.1.1.1";
133        const RESPONSE: i64 = 200;
134        let http_response = HttpResponseDTO::new(BUCKET_TIMESTAMP, CLIENT, SERVER, RESPONSE);
135        let mut binary_user_reader = ReaderBuilder::new().build(http_response.encode()).unwrap();
136
137        assert_eq!(StreamItem::Value(IonType::Struct), binary_user_reader.next().unwrap());
138        binary_user_reader.step_in().unwrap();
139
140        assert_eq!(StreamItem::Value(IonType::Int), binary_user_reader.next().unwrap());
141        assert_eq!("date", binary_user_reader.field_name().unwrap());
142        assert_eq!(BUCKET_TIMESTAMP, binary_user_reader.read_i64().unwrap());
143        
144        assert_eq!(StreamItem::Value(IonType::String), binary_user_reader.next().unwrap());
145        assert_eq!("client", binary_user_reader.field_name().unwrap());
146        assert_eq!(CLIENT,  binary_user_reader.read_string().unwrap().text());
147
148        assert_eq!(StreamItem::Value(IonType::String), binary_user_reader.next().unwrap());
149        assert_eq!("server", binary_user_reader.field_name().unwrap());
150        assert_eq!(SERVER,  binary_user_reader.read_string().unwrap());
151
152        assert_eq!(StreamItem::Value(IonType::Int), binary_user_reader.next().unwrap());
153        assert_eq!("response", binary_user_reader.field_name().unwrap());
154        assert_eq!(RESPONSE,  binary_user_reader.read_i64().unwrap());
155
156        binary_user_reader.step_out().unwrap();
157    }
158
159    #[test]
160    fn endec_http_response() {
161        const BUCKET_TIMESTAMP: i64 = 123456789;
162        const CLIENT: &str = "0.0.0.0";
163        const SERVER: &str = "1.1.1.1";
164        const RESPONSE: i64 = 200;
165        let http_response = HttpResponseDTO::new(BUCKET_TIMESTAMP, CLIENT, SERVER, RESPONSE);
166        assert_eq!(http_response, HttpResponseDTO::decode(&http_response.encode()));
167    }
168}