Skip to main content

wx_sdk/mp/event/
msg_link.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 LinkMessage {
11    pub msg_id: u64,
12    pub title: String,
13    pub description: String,
14    pub url: String,
15}
16
17impl ReceivedMessageParser for LinkMessage {
18    type ReceivedMessage = LinkMessage;
19
20    fn from_xml(node: &Node) -> SdkResult<Self::ReceivedMessage> {
21        let msg_id = get_number_from_root::<u64>(node, "MsgId")?;
22        let title = get_text_from_root(node, "Title")?;
23        let description = get_text_from_root(node, "Description")?;
24        let url = get_text_from_root(node, "Url")?;
25
26        Ok(LinkMessage {
27            msg_id,
28            title: title.to_owned(),
29            description: description.to_owned(),
30            url: url.to_owned(),
31        })
32    }
33}
34
35#[cfg(test)]
36mod tests {
37    use super::*;
38    use crate::SdkResult;
39    #[test]
40    pub fn parse() -> SdkResult<()> {
41        use roxmltree::Document;
42        let s = "<xml>
43    <ToUserName><![CDATA[toUser]]></ToUserName>
44    <FromUserName><![CDATA[fromUser]]></FromUserName>
45    <CreateTime>1351776360</CreateTime>
46    <MsgType><![CDATA[link]]></MsgType>
47    <Title><![CDATA[公众平台官网链接]]></Title>
48    <Description><![CDATA[公众平台官网链接]]></Description>
49    <Url><![CDATA[url]]></Url>
50    <MsgId>1234567890123456</MsgId>
51</xml>";
52        let node = Document::parse(&s)?;
53        let msg = LinkMessage::from_xml(&node.root())?;
54        assert_eq!(msg.title, "公众平台官网链接");
55        assert_eq!(msg.url, "url");
56        assert_eq!(msg.msg_id, 1234567890123456);
57        Ok(())
58    }
59}