net_reporter_api/api/total_http_requests/
http_requests_bucket.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 = "bucket";
15
16#[derive(Debug, PartialEq, Eq, Clone)]
17pub struct HttpRequestsBucketDTO {
18    bucket_timestamp: i64,
19    total_requests: i64,
20}
21impl API for HttpRequestsBucketDTO { }
22
23impl HttpRequestsBucketDTO {
24    pub fn new(bucket_timestamp: i64, total_requests: i64) -> Self {
25        HttpRequestsBucketDTO {
26            bucket_timestamp,
27            total_requests,
28        }
29    }
30
31    pub fn get_bucket_timestamp(&self) -> i64 {
32        self.bucket_timestamp
33    }
34
35    pub fn get_total_requests(&self) -> i64 {
36        self.total_requests
37    }
38}
39
40impl Encoder for HttpRequestsBucketDTO {
41    fn encode(&self) -> Vec<u8> {
42        let buffer: Vec<u8> = Vec::new();
43
44        let binary_writer_builder = ion_rs::BinaryWriterBuilder::new(); 
45        let mut writer = binary_writer_builder.build(buffer.clone()).unwrap();
46        
47        writer.step_in(IonType::Struct).expect("Error while creating an ion struct");
48        
49        writer.set_field_name("bucket_timestamp");
50        writer.write_i64(self.bucket_timestamp).unwrap();
51
52        writer.set_field_name("total_requests");
53        writer.write_i64(self.total_requests).unwrap();
54
55        writer.step_out().unwrap();
56        writer.flush().unwrap();
57
58        writer.output().as_slice().into()
59    }
60}
61
62impl Decoder for HttpRequestsBucketDTO {
63    fn decode(data: &[u8]) -> Self {
64
65        let mut binary_user_reader = ReaderBuilder::new().build(data).unwrap();
66        binary_user_reader.next().unwrap();
67        binary_user_reader.step_in().unwrap();
68
69        binary_user_reader.next().unwrap();
70        let bucket_timestamp = binary_user_reader.read_i64().unwrap();
71
72        binary_user_reader.next().unwrap();
73        let total_requests = binary_user_reader.read_i64().unwrap();
74
75        HttpRequestsBucketDTO::new(
76            bucket_timestamp,
77            total_requests
78        )
79    }
80}
81
82impl Typed for HttpRequestsBucketDTO {
83    fn get_data_type() -> &'static str {
84        DATA_TYPE
85    }
86    fn get_type(&self) -> &str {
87        Self::get_data_type()
88    }
89}
90
91
92#[cfg(test)]
93mod tests {
94    use ion_rs::IonType;
95    use ion_rs::IonReader;
96    use ion_rs::ReaderBuilder;
97    use ion_rs::StreamItem;
98
99    use net_core_api::core::encoder_api::Encoder;
100    use net_core_api::core::decoder_api::Decoder;
101
102    use crate::api::total_http_requests::http_requests_bucket::HttpRequestsBucketDTO;
103
104    #[test]
105    fn reader_correctly_read_encoded_requests_bucket() {
106        const BUCKET_TIMESTAMP: i64 = i64::MAX;
107        const TOTAL_REQUESTS: i64 = i64::MAX;
108
109        let bandwidth_bucket = HttpRequestsBucketDTO::new(
110            BUCKET_TIMESTAMP,
111            TOTAL_REQUESTS
112        );
113        let mut binary_user_reader = ReaderBuilder::new().build(bandwidth_bucket.encode()).unwrap();
114
115        assert_eq!(StreamItem::Value(IonType::Struct), binary_user_reader.next().unwrap());
116        binary_user_reader.step_in().unwrap();
117        
118        assert_eq!(StreamItem::Value(IonType::Int), binary_user_reader.next().unwrap());
119        assert_eq!("bucket_timestamp", binary_user_reader.field_name().unwrap());
120        assert_eq!(BUCKET_TIMESTAMP,  binary_user_reader.read_i64().unwrap());
121
122        assert_eq!(StreamItem::Value(IonType::Int), binary_user_reader.next().unwrap());
123        assert_eq!("total_requests", binary_user_reader.field_name().unwrap());
124        assert_eq!(TOTAL_REQUESTS,  binary_user_reader.read_i64().unwrap());
125
126        binary_user_reader.step_out().unwrap();
127    }
128
129    #[test]
130    fn endec_requests_bucket() {
131        const BUCKET_TIMESTAMP: i64 = i64::MAX;
132        const TOTAL_REQUESTS: i64 = i64::MAX;
133
134        let bandwidth_bucket = HttpRequestsBucketDTO::new(
135            BUCKET_TIMESTAMP,
136            TOTAL_REQUESTS
137        );
138        assert_eq!(bandwidth_bucket, HttpRequestsBucketDTO::decode(&bandwidth_bucket.encode()));
139    }
140}
141