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