net_reporter_api/api/network_bandwidth/
bandwidth_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
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