net_core_api/api/primitives/
integer.rs

1use ion_rs;
2
3use ion_rs::IonReader;
4use ion_rs::IonWriter;
5
6use crate::core::api::API;
7use crate::core::decoder_api::Decoder;
8use crate::core::encoder_api::Encoder;
9use crate::core::typed_api::Typed;
10
11const DATA_TYPE: &str = "integer";
12
13#[derive(Debug, PartialEq, Eq, Clone)]
14pub struct Integer {
15    value: i64,
16}
17
18impl API for Integer {}
19
20impl Integer {
21    pub fn new(value: i64) -> Self {
22        Integer { value }
23    }
24
25    pub fn get_value(&self) -> i64 {
26        self.value
27    }
28}
29
30impl Typed for Integer {
31    fn get_type(&self) -> &str {
32        DATA_TYPE
33    }
34
35    fn get_data_type() -> &'static str where Self : Sized {
36        DATA_TYPE
37    }
38}
39
40impl Encoder for Integer {
41    fn encode(&self) -> Vec<u8> {
42        let buffer: Vec<u8> = Vec::new();
43
44        let binary_writer_builder = ion_rs::BinaryWriterBuilder::new();
45        
46        let mut writer = binary_writer_builder.build(buffer.clone()).unwrap();
47        
48        writer.step_in(ion_rs::IonType::Struct).expect("Error while creating an ion struct");
49
50        writer.set_field_name("value");
51        writer.write_i64(self.value).unwrap();
52
53        writer.step_out().unwrap();
54        writer.flush().unwrap();
55
56        writer.output().as_slice().to_owned()
57    }
58}
59
60impl Decoder for Integer {
61    fn decode(data: &[u8]) -> Self {
62        let mut binary_user_reader = ion_rs::ReaderBuilder::new().build(data).unwrap();
63        binary_user_reader.next().unwrap();
64        binary_user_reader.step_in().unwrap();
65
66        binary_user_reader.next().unwrap();
67        let value = binary_user_reader.read_i64().unwrap();
68
69        Integer::new(value)
70    }
71}
72
73
74#[cfg(test)]
75mod tests {
76    use ion_rs::IonType;
77    use ion_rs::IonReader;
78    use ion_rs::ReaderBuilder;
79    use ion_rs::StreamItem;
80
81    use crate::core::decoder_api::Decoder;
82    use crate::core::encoder_api::Encoder;
83    use crate::core::typed_api::Typed;
84
85
86    use super::Integer;
87
88
89    #[test]
90    fn reader_correctly_read_encoded_integer() {
91        const INTEGER_VALUE: i64 = 228;
92        let integer = Integer::new(INTEGER_VALUE);
93
94        let mut binary_user_reader = ReaderBuilder::new().build(integer.encode()).unwrap();
95
96        assert_eq!(StreamItem::Value(IonType::Struct), binary_user_reader.next().unwrap());
97        binary_user_reader.step_in().unwrap();
98
99        assert_eq!(StreamItem::Value(IonType::Int), binary_user_reader.next().unwrap());
100        assert_eq!("value", binary_user_reader.field_name().unwrap());
101        assert_eq!(INTEGER_VALUE,  binary_user_reader.read_i64().unwrap());
102
103        binary_user_reader.step_out().unwrap();
104    }
105    
106    #[test]
107    fn endec_integer() {
108        const INTEGER_VALUE: i64 = 228;
109        let integer = Integer::new(INTEGER_VALUE);
110        assert_eq!(integer, Integer::decode(&integer.encode()));
111    }
112
113    #[test]
114    fn test_getting_data_types() {
115        const INTEGER_VALUE: i64 = 228;
116        let integer = Integer::new(INTEGER_VALUE);
117        
118        assert_eq!(integer.get_type(), Integer::get_data_type());
119        assert_eq!(integer.get_type(), super::DATA_TYPE);
120    }
121}