wx_sdk/mp/event/
msg_link.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 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}