net_core_api/api/primitives/
string.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 = "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}