1extern crate yaserde;
2#[macro_use]
3extern crate yaserde_derive;
4extern crate xml;
5
6use std::io::{Read, Write};
7use yaserde::de::from_reader;
8use yaserde::ser::to_string;
9use yaserde::{YaDeserialize, YaSerialize};
10
11use rand::Rng;
12
13#[derive(YaSerialize, YaDeserialize, PartialEq, Debug)]
14#[yaserde(rename = "IRIS")]
15pub struct SPRequest {
16 #[yaserde(attribute)]
17 #[yaserde(rename = "Version")]
18 version: u8,
19 #[yaserde(attribute)]
20 #[yaserde(rename = "Message")]
21 message: String,
22 #[yaserde(attribute)]
23 #[yaserde(rename = "MessageTypeId")]
24 message_type_id: u8,
25 #[yaserde(attribute)]
26 #[yaserde(rename = "MessageId")]
27 message_id: String,
28
29 #[yaserde(rename = "msgSubType")]
30 msg_sub_type: String,
31
32 #[yaserde(rename = "msgType")]
33 msg_type: String,
34
35 #[yaserde(rename = "msisdnA")]
36 msisdn_a: u64,
37
38 #[yaserde(rename = "msisdnB")]
39 msisdn_b: u64,
40
41 #[yaserde(rename = "partNumber")]
42 part_number: u32,
43
44 #[yaserde(rename = "sessionId")]
45 session_id: String,
46
47 #[yaserde(rename = "siebelId")]
48 siebel_id: String,
49
50 #[yaserde(rename = "smsBody")]
51 sms_body: String,
52
53 #[yaserde(rename = "smsId")]
54 sms_id: String,
55
56 #[yaserde(rename = "timestamp")]
57 timestamp: String,
58
59 #[yaserde(rename = "vlr")]
60 vlr: String,
61}
62
63impl SPRequest {
64 pub fn new(s: &[u8]) -> Self {
65 let req: SPRequest = from_reader(s).unwrap();
66 req
67 }
68
69 pub fn serialize(&self) -> Result<String, String> {
70 let s = to_string(self)?;
71 Ok(s.replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>", ""))
74 }
75
76 pub fn gen_message_id(&mut self) {
77 let mut rng = rand::thread_rng();
78 let msg_id: u64 = rng.gen();
79 let msg_id = format!("{:08x}", msg_id);
80 msg_id.to_string();
81 self.message_id = msg_id.to_string();
82 }
83}
84
85#[derive(YaSerialize, YaDeserialize, PartialEq, Debug)]
86#[yaserde(rename = "IRIS")]
87pub struct SPResponse {
88 #[yaserde(attribute)]
89 #[yaserde(rename = "Version")]
90 version: u8,
91 #[yaserde(attribute)]
92 #[yaserde(rename = "Message")]
93 message: String,
94 #[yaserde(attribute)]
95 #[yaserde(rename = "MessageTypeId")]
96 message_type_id: u8,
97 #[yaserde(attribute)]
98 #[yaserde(rename = "MessageId")]
99 message_id: String,
100 #[yaserde(attribute)]
101 #[yaserde(rename = "IrisInstance")]
102 iris_instance: String,
103 #[yaserde(attribute)]
104 #[yaserde(rename = "SystemTime")]
105 system_time: String,
106 #[yaserde(attribute)]
107 #[yaserde(rename = "UniqueRecordId")]
108 uniq_record_id: u32,
109 #[yaserde(attribute)]
110 #[yaserde(rename = "Merging")]
111 merging: u8,
112 #[yaserde(attribute)]
113 #[yaserde(rename = "InstanceStatus")]
114 instance_status: String,
115 #[yaserde(attribute)]
116 #[yaserde(rename = "Latency")]
117 latency: f32,
118 #[yaserde(attribute)]
119 #[yaserde(rename = "ErrorCode")]
120 err_code: i32,
121}
122
123impl SPResponse {
124 pub fn new(s: &[u8]) -> Self {
125 let resp: SPResponse = from_reader(s).unwrap();
126 resp
127 }
128
129 pub fn serialize(&self) -> Result<String, String> {
130 let s = to_string(self)?;
131 Ok(s.replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>", ""))
134 }
135}
136
137#[cfg(test)]
138mod tests {
139 use super::*;
140
141 #[test]
142 fn dummy_serialization() {
143 let msg = SPRequest {
144 version: 1,
145 message: String::from("ModelRequest"),
146 message_type_id: 60,
147 message_id: String::from("0af87c75503b4401"),
148 msg_sub_type: String::from("iddqd"),
149 msg_type: String::from("aaaa"),
150 msisdn_a: 231231,
151 msisdn_b: 54656456,
152 part_number: 127,
153 session_id: String::from("bbbbb"),
154 siebel_id: String::from("ccccc"),
155 sms_body: String::from("ddddd"),
156 sms_id: String::from("eee"),
157 timestamp: String::from("2020-04-27 12:00:00"),
158 vlr: String::from("36028797018963968"),
159 };
160
161 assert_eq!(
162 msg.serialize().unwrap(),
163 r#"<IRIS Version="1" Message="ModelRequest" MessageTypeId="60" MessageId="0af87c75503b4401"><msgSubType>iddqd</msgSubType><msgType>aaaa</msgType><msisdnA>231231</msisdnA><msisdnB>54656456</msisdnB><partNumber>127</partNumber><sessionId>bbbbb</sessionId><siebelId>ccccc</siebelId><smsBody>ddddd</smsBody><smsId>eee</smsId><timestamp>2020-04-27 12:00:00</timestamp><vlr>36028797018963968</vlr></IRIS>"#
164 );
165 }
166
167 #[test]
168 fn dummy_request_deserialization() {
169 let s = r#"
170 <IRIS Version="1" Message="ModelRequest" MessageTypeId="60" MessageId="0af87c75503b4401">
171 <msgSubType>iddqd</msgSubType>
172 <msgType>aaaa</msgType>
173 <msisdnA>231231</msisdnA>
174 <msisdnB>54656456</msisdnB>
175 <partNumber>127</partNumber>
176 <sessionId>bbbbb</sessionId>
177 <siebelId>ccccc</siebelId>
178 <smsBody>ddddd</smsBody>
179 <smsId>eee</smsId>
180 <timestamp>2020-04-27 12:00:00</timestamp>
181 <vlr>36028797018963968</vlr>
182 </IRIS>"#;
183
184 let mut req: SPRequest = from_reader(s.as_bytes()).unwrap();
185
186 assert_eq!(req.version, 1);
187 assert_eq!(req.message, "ModelRequest");
188 assert_eq!(req.message_type_id, 60);
189 assert_eq!(req.message_id, "0af87c75503b4401");
190 assert_eq!(req.msg_sub_type, "iddqd");
191 assert_eq!(req.msg_type, "aaaa");
192 assert_eq!(req.msisdn_a, 231231);
193 assert_eq!(req.msisdn_b, 54656456);
194 assert_eq!(req.part_number, 127);
195 assert_eq!(req.session_id, "bbbbb");
196 assert_eq!(req.siebel_id, "ccccc");
197 assert_eq!(req.sms_body, "ddddd");
198 assert_eq!(req.sms_id, "eee");
199 assert_eq!(req.timestamp, "2020-04-27 12:00:00");
200 assert_eq!(req.vlr, "36028797018963968");
201
202 req.gen_message_id();
203 assert_ne!(
204 req.message_id, "0af87c75503b4401",
205 "Message ID should have been changed"
206 );
207 }
208
209 #[test]
210 fn sp_request_new() {
211 let s = r#"
212 <IRIS Version="1" Message="ModelRequest" MessageTypeId="60" MessageId="0af87c75503b4401">
213 <msgSubType>iddqd</msgSubType>
214 <msgType>aaaa</msgType>
215 <msisdnA>231231</msisdnA>
216 <msisdnB>54656456</msisdnB>
217 <partNumber>127</partNumber>
218 <sessionId>bbbbb</sessionId>
219 <siebelId>ccccc</siebelId>
220 <smsBody>ddddd</smsBody>
221 <smsId>eee</smsId>
222 <timestamp>2020-04-27 12:00:00</timestamp>
223 <vlr>36028797018963968</vlr>
224 </IRIS>"#;
225
226 let req = SPRequest::new(s.as_bytes());
227 assert_eq!(req.version, 1);
228 }
229
230 #[test]
231 fn dummy_responce_deserialization() {
232 let s = r##"
233 <IRIS Version="1" Message="ModelResponse" IrisInstance="INSTANCE_1_(DS-PR-" MessageTypeId="60" SystemTime="2020-05-18 23:39:19" UniqueRecordId="1882261" MessageId="0af87c75503b4401" Merging="0" InstanceStatus="Ok" Latency="1.15" ErrorCode="0"></IRIS>
234 "##;
235
236 let resp = SPResponse::new(s.as_bytes());
237 assert_eq!(resp.version, 1);
238 assert_eq!(resp.message, "ModelResponse");
239 assert_eq!(resp.iris_instance, "INSTANCE_1_(DS-PR-");
240 assert_eq!(resp.message_type_id, 60);
241 assert_eq!(resp.system_time, "2020-05-18 23:39:19");
242 assert_eq!(resp.uniq_record_id, 1882261);
243 assert_eq!(resp.message_id, "0af87c75503b4401");
244 assert_eq!(resp.merging, 0);
245 assert_eq!(resp.instance_status, "Ok");
246 assert_eq!(resp.latency, 1.15);
247 assert_eq!(resp.err_code, 0);
248 }
249}