net_core_api/api/primitives/
integer.rs1use 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}