net_reporter_api/api/total_http_requests/
http_requests_bucket.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 = "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