Skip to main content

wx_sdk/mp/event/
msg_location.rs

1use 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}