wx_sdk/mp/event/
msg_location.rs1use roxmltree::Node;
2
3use crate::SdkResult;
4
5use super::{
6 xmlutil::{get_number_from_root, get_text_from_root},
7 ReceivedMessageParser,
8};
9
10pub struct LocationMessage {
11 pub msg_id: u64,
12 pub location_x: f32,
13 pub location_y: f32,
14 pub scale: f32,
15 pub label: String,
16}
17
18impl ReceivedMessageParser for LocationMessage {
19 type ReceivedMessage = LocationMessage;
20
21 fn from_xml(node: &Node) -> SdkResult<Self::ReceivedMessage> {
22 let msg_id = get_number_from_root::<u64>(node, "MsgId")?;
23 let location_x = get_number_from_root::<f32>(node, "Location_X")?;
24 let location_y = get_number_from_root::<f32>(node, "Location_Y")?;
25 let scale = get_number_from_root::<f32>(node, "Scale")?;
26 let label = get_text_from_root(node, "Label")?;
27
28 Ok(LocationMessage {
29 msg_id,
30 location_x,
31 location_y,
32 scale,
33 label: label.to_owned(),
34 })
35 }
36}
37
38#[cfg(test)]
39mod tests {
40 use super::*;
41 use crate::SdkResult;
42 #[test]
43 pub fn parse() -> SdkResult<()> {
44 use roxmltree::Document;
45 let s = "<xml>
46 <ToUserName><![CDATA[toUser]]></ToUserName>
47 <FromUserName><![CDATA[fromUser]]></FromUserName>
48 <CreateTime>1351776360</CreateTime>
49 <MsgType><![CDATA[location]]></MsgType>
50 <Location_X>23.134521</Location_X>
51 <Location_Y>113.358803</Location_Y>
52 <Scale>20</Scale>
53 <Label><![CDATA[位置信息]]></Label>
54 <MsgId>1234567890123456</MsgId>
55</xml>";
56 let node = Document::parse(&s)?;
57 let msg = LocationMessage::from_xml(&node.root())?;
58 assert_eq!(msg.location_x, 23.134521);
59 assert_eq!(msg.scale, 20.0);
60 assert_eq!(msg.msg_id, 1234567890123456);
61 assert_eq!(msg.label, "位置信息");
62 Ok(())
63 }
64}