net_reporter_api/api/http_responses_distribution/
http_responses_disribution_filters.rs

1use ion_rs;
2
3use ion_rs::element::reader::ElementReader;
4use ion_rs::IonReader;
5use ion_rs::IonType;
6use ion_rs::IonWriter;
7use ion_rs::ReaderBuilder;
8use ion_rs::StreamItem;
9
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 = "http_responses_distribution_filters";
16
17#[derive(Debug, PartialEq, Eq, Clone)]
18pub struct HttpResponsesDistributionFiltersDTO {
19    endpoints: Vec<String>,
20    include_endpoints_mode: Option<bool>,
21    bytes_lower_bound: Option<i64>,
22    bytes_upper_bound: Option<i64>,
23}
24impl API for HttpResponsesDistributionFiltersDTO { }
25
26impl HttpResponsesDistributionFiltersDTO {
27    pub fn new(
28        endpoints: &[String],
29        include_endpoints_mode: Option<bool>,
30        bytes_lower_bound: Option<i64>,
31        bytes_upper_bound: Option<i64>,
32    ) -> Self {
33        HttpResponsesDistributionFiltersDTO {
34            endpoints: endpoints.to_vec(),
35            include_endpoints_mode,
36            bytes_lower_bound,
37            bytes_upper_bound,
38        }
39    }
40
41    pub fn get_endpoints(&self) -> &[String] {
42        self.endpoints.as_slice()
43    }
44
45    pub fn is_include_endpoints_mode(&self) -> Option<bool> {
46        self.include_endpoints_mode
47    }
48
49    pub fn get_bytes_lower_bound(&self) -> Option<i64> {
50        self.bytes_lower_bound
51    }
52
53    pub fn get_bytes_upper_bound(&self) -> Option<i64> {
54        self.bytes_upper_bound
55    }
56}
57
58impl Encoder for HttpResponsesDistributionFiltersDTO {
59    fn encode(&self) -> Vec<u8> {
60        let buffer: Vec<u8> = Vec::new();
61
62        let binary_writer_builder = ion_rs::BinaryWriterBuilder::new();
63        let mut writer = binary_writer_builder.build(buffer.clone()).unwrap();
64        
65        writer.step_in(IonType::Struct).expect("Error while creating an ion struct");
66
67        writer.set_field_name("include_endpoints_mode");
68        match self.include_endpoints_mode {
69            Some(include_endpoints_mode) => {
70                writer.write_bool(include_endpoints_mode).unwrap();
71                writer.set_field_name("endpoints");
72                writer.step_in(IonType::List).expect("Error while entering an ion list");
73                self.endpoints.iter().for_each(|endpoint| {
74                    writer.write_string(endpoint).unwrap();
75                });
76                writer.step_out().unwrap();
77            },
78            None => writer.write_null(IonType::Bool).unwrap(),
79        }
80
81        writer.set_field_name("bytes_lower_bound");
82        match self.bytes_lower_bound {
83            Some(bytes_lower_bound) => writer.write_i64(bytes_lower_bound).unwrap(),
84            None => writer.write_null(IonType::Int).unwrap(),
85        }
86
87        writer.set_field_name("bytes_upper_bound");
88        match self.bytes_upper_bound {
89            Some(bytes_upper_bound) => writer.write_i64(bytes_upper_bound).unwrap(),
90            None => writer.write_null(IonType::Int).unwrap(),
91        }
92        
93        writer.step_out().unwrap();
94        writer.flush().unwrap();
95
96        writer.output().as_slice().into()
97    }
98}
99
100impl Decoder for HttpResponsesDistributionFiltersDTO {
101    fn decode(data: &[u8]) -> Self {
102
103        let mut binary_user_reader = ReaderBuilder::new().build(data).unwrap();
104        binary_user_reader.next().unwrap();
105        binary_user_reader.step_in().unwrap();
106
107        binary_user_reader.next().unwrap();
108        let (include_endpoints, endpoints) = match binary_user_reader.current() {
109            StreamItem::Value(_) => {
110                let include_endpoints = binary_user_reader.read_bool().unwrap();
111                binary_user_reader.next().unwrap();
112                binary_user_reader.step_in().unwrap();
113                let endpoints_elements = binary_user_reader.read_all_elements().unwrap();
114                let mut endpoints = Vec::with_capacity(endpoints_elements.len());
115                endpoints_elements.iter().for_each(|element| {
116                    let endpoint = element.as_string().unwrap();
117                    endpoints.push(endpoint.to_owned());
118                });
119                
120                binary_user_reader.step_out().unwrap();
121                (Some(include_endpoints), endpoints)
122            },
123            _ => (None, vec![]),
124        };
125
126        binary_user_reader.next().unwrap();
127        let bytes_lower_bound = match binary_user_reader.current() {
128            StreamItem::Value(_) => Some(binary_user_reader.read_i64().unwrap()),
129            _ => None,
130        };
131
132        binary_user_reader.next().unwrap();
133        let bytes_upper_bound = match binary_user_reader.current() {
134            StreamItem::Value(_) => Some(binary_user_reader.read_i64().unwrap()),
135            _ => None,
136        };
137
138        HttpResponsesDistributionFiltersDTO::new(
139            endpoints.as_slice(),
140            include_endpoints,
141            bytes_lower_bound,
142            bytes_upper_bound,
143        )
144    }
145}
146
147impl Typed for HttpResponsesDistributionFiltersDTO {
148    fn get_data_type() -> &'static str {
149        DATA_TYPE
150    }
151
152    fn get_type(&self) -> &str {
153        Self::get_data_type()
154    }
155}
156
157#[cfg(test)]
158mod tests {
159    use ion_rs::element::reader::ElementReader;
160    use ion_rs::IonType;
161    use ion_rs::IonReader;
162    use ion_rs::ReaderBuilder;
163    use ion_rs::StreamItem;
164    
165    use net_core_api::core::encoder_api::Encoder;
166    use net_core_api::core::decoder_api::Decoder;
167
168    use crate::api::http_responses_distribution::http_responses_disribution_filters::HttpResponsesDistributionFiltersDTO;
169
170    
171    #[test]
172    fn reader_correctly_read_encoded_http_responses_filters_0() {
173        let endpoints = vec!["0.0.0.0".to_string(), "1.1.1.1".to_string()];
174        const INCLUDE_ENDPOINTS_MODE: bool = true;
175        let bytes_lower_bound = Some(100);
176        
177        let filters = HttpResponsesDistributionFiltersDTO::new(
178            &endpoints,
179            Some(INCLUDE_ENDPOINTS_MODE),
180            bytes_lower_bound,
181            None,
182        );
183        
184        let mut binary_user_reader = ReaderBuilder::new().build(filters.encode()).unwrap();
185
186        assert_eq!(StreamItem::Value(IonType::Struct), binary_user_reader.next().unwrap());
187        binary_user_reader.step_in().unwrap();
188
189        assert_eq!(StreamItem::Value(IonType::Bool), binary_user_reader.next().unwrap());
190        assert_eq!("include_endpoints_mode", binary_user_reader.field_name().unwrap());
191        assert_eq!(INCLUDE_ENDPOINTS_MODE,  binary_user_reader.read_bool().unwrap());
192
193        assert_eq!(StreamItem::Value(IonType::List), binary_user_reader.next().unwrap());
194        assert_eq!("endpoints", binary_user_reader.field_name().unwrap());
195        binary_user_reader.step_in().unwrap();
196        let elements = binary_user_reader.read_all_elements().unwrap();
197        assert_eq!(elements.len(), endpoints.len());
198        for (element, core_endpoint) in elements.iter().zip(endpoints.as_slice()) {
199            let endpoint = element.as_string().unwrap();
200            assert_eq!(endpoint, *core_endpoint);
201        }
202        binary_user_reader.step_out().unwrap();
203
204        assert_eq!(StreamItem::Value(IonType::Int), binary_user_reader.next().unwrap());
205        assert_eq!("bytes_lower_bound", binary_user_reader.field_name().unwrap());
206        assert_eq!(*bytes_lower_bound.as_ref().unwrap(),  binary_user_reader.read_i64().unwrap());
207
208        assert_eq!(StreamItem::Null(IonType::Int), binary_user_reader.next().unwrap());
209        assert_eq!("bytes_upper_bound", binary_user_reader.field_name().unwrap());
210
211        binary_user_reader.step_out().unwrap();
212    }
213
214    
215    #[test]
216    fn reader_correctly_read_encoded_http_responses_filters_1() {
217        let endpoints = vec![];
218        let bytes_upper_bound = Some(100);
219        
220        let filters = HttpResponsesDistributionFiltersDTO::new(
221            &endpoints,
222            None,
223            None,
224            bytes_upper_bound,
225        );
226        
227        let mut binary_user_reader = ReaderBuilder::new().build(filters.encode()).unwrap();
228
229        assert_eq!(StreamItem::Value(IonType::Struct), binary_user_reader.next().unwrap());
230        binary_user_reader.step_in().unwrap();
231
232        assert_eq!(StreamItem::Null(IonType::Bool), binary_user_reader.next().unwrap());
233        assert_eq!("include_endpoints_mode", binary_user_reader.field_name().unwrap());
234
235        assert_eq!(StreamItem::Null(IonType::Int), binary_user_reader.next().unwrap());
236        assert_eq!("bytes_lower_bound", binary_user_reader.field_name().unwrap());
237
238        assert_eq!(StreamItem::Value(IonType::Int), binary_user_reader.next().unwrap());
239        assert_eq!("bytes_upper_bound", binary_user_reader.field_name().unwrap());
240        assert_eq!(*bytes_upper_bound.as_ref().unwrap(),  binary_user_reader.read_i64().unwrap());
241
242        binary_user_reader.step_out().unwrap();
243    }
244
245    #[test]
246    fn reader_correctly_read_encoded_http_responses_filters_2() {
247        let endpoints = vec!["0.0.0.0".to_string(), "1.1.1.1".to_string()];
248        const INCLUDE_ENDPOINTS_MODE: bool = true;
249        
250        let filters = HttpResponsesDistributionFiltersDTO::new(
251            &endpoints,
252            Some(INCLUDE_ENDPOINTS_MODE),
253            None,
254            None,
255        );
256        
257        let mut binary_user_reader = ReaderBuilder::new().build(filters.encode()).unwrap();
258
259        assert_eq!(StreamItem::Value(IonType::Struct), binary_user_reader.next().unwrap());
260        binary_user_reader.step_in().unwrap();
261
262        assert_eq!(StreamItem::Value(IonType::Bool), binary_user_reader.next().unwrap());
263        assert_eq!("include_endpoints_mode", binary_user_reader.field_name().unwrap());
264        assert_eq!(INCLUDE_ENDPOINTS_MODE,  binary_user_reader.read_bool().unwrap());
265
266        assert_eq!(StreamItem::Value(IonType::List), binary_user_reader.next().unwrap());
267        assert_eq!("endpoints", binary_user_reader.field_name().unwrap());
268        binary_user_reader.step_in().unwrap();
269        let elements = binary_user_reader.read_all_elements().unwrap();
270        assert_eq!(elements.len(), endpoints.len());
271        for (element, core_endpoint) in elements.iter().zip(endpoints.as_slice()) {
272            let endpoint = element.as_string().unwrap();
273            assert_eq!(endpoint, *core_endpoint);
274        }
275        binary_user_reader.step_out().unwrap();
276
277        assert_eq!(StreamItem::Null(IonType::Int), binary_user_reader.next().unwrap());
278        assert_eq!("bytes_lower_bound", binary_user_reader.field_name().unwrap());
279
280        assert_eq!(StreamItem::Null(IonType::Int), binary_user_reader.next().unwrap());
281        assert_eq!("bytes_upper_bound", binary_user_reader.field_name().unwrap());
282
283
284        binary_user_reader.step_out().unwrap();
285    }
286
287
288    #[test]
289    fn endec_http_respnses_filters() {
290        let endpoints = vec!["0.0.0.0".to_string(), "1.1.1.1".to_string()];
291        const INCLUDE_ENDPOINTS_MODE: bool = true;
292        
293        let filters: HttpResponsesDistributionFiltersDTO = HttpResponsesDistributionFiltersDTO::new(
294            &endpoints,
295            Some(INCLUDE_ENDPOINTS_MODE),
296            None,
297            None,
298        );
299        
300        assert_eq!(filters, HttpResponsesDistributionFiltersDTO::decode(&filters.encode()));
301    }
302}