net_reporter_api/api/http_responses/
http_response.rs1use 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}