net_core_api/api/primitives/
string.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 = "string";
12
13#[derive(Debug, PartialEq, Eq, Clone)]
14pub struct StringDTO {
15    value: String,
16}
17
18impl API for StringDTO {}
19
20impl StringDTO {
21    pub fn new(value: &str) -> Self {
22        StringDTO { value: value.to_string() }
23    }
24
25    pub fn get_value(&self) -> &str {
26        &self.value
27    }
28}
29
30impl Typed for StringDTO {
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 StringDTO {
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_string(&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 StringDTO {
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_string().unwrap();
68
69        StringDTO::new(value.text())
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::StringDTO;
87
88
89    #[test]
90    fn reader_correctly_read_encoded_string() {
91        const STRING_VALUE: &str = "value";
92        let string = StringDTO::new(STRING_VALUE);
93
94        let mut binary_user_reader = ReaderBuilder::new().build(string.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::String), binary_user_reader.next().unwrap());
100        assert_eq!("value", binary_user_reader.field_name().unwrap());
101        assert_eq!(STRING_VALUE,  binary_user_reader.read_string().unwrap().text());
102
103        binary_user_reader.step_out().unwrap();
104    }
105    
106    #[test]
107    fn endec_string() {
108        const STRING_VALUE: &str = "value";
109        let string = StringDTO::new(STRING_VALUE);
110
111        assert_eq!(string, StringDTO::decode(&string.encode()));
112    }
113
114    #[test]
115    fn test_getting_data_types() {
116        const STRING_VALUE: &str = "value";
117        let string = StringDTO::new(STRING_VALUE);
118        
119        assert_eq!(string.get_type(), StringDTO::get_data_type());
120        assert_eq!(string.get_type(), super::DATA_TYPE);
121    }
122}