sp_xml/
lib.rs

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        // Removing leading <?xml version="1.0" encoding="utf-8"?>
72        // TODO: more sophisticated removal solution using xml-rs
73        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        // Removing leading <?xml version="1.0" encoding="utf-8"?>
132        // TODO: more sophisticated removal solution using xml-rs
133        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}