wx_sdk/mp/event/
msg_text.rs1use roxmltree::Node;
2
3use crate::{error::SdkError, SdkResult};
4
5use super::ReceivedMessageParser;
6
7pub struct TextMessage {
8 pub msg_id: u64,
9 pub content: String,
10}
11
12impl ReceivedMessageParser for TextMessage {
13 type ReceivedMessage = TextMessage;
14
15 fn from_xml(node: &Node) -> SdkResult<Self::ReceivedMessage> {
16 let content = node
17 .descendants()
18 .find(|n| n.has_tag_name("Content"))
19 .map(|n| n.text())
20 .flatten()
21 .ok_or_else(|| SdkError::InvalidParams("parse xml need Content params".to_owned()))?;
22 let msg_id = node
23 .descendants()
24 .find(|n| n.has_tag_name("MsgId"))
25 .map(|n| n.text())
26 .flatten()
27 .ok_or_else(|| SdkError::InvalidParams("parse xml need MsgId params".to_owned()))?;
28 let msg_id = msg_id.parse::<u64>().map_err(|_e| {
29 SdkError::InvalidParams(
30 "Parse XML msg from wechat error: tag `MsgId` should be number".to_string(),
31 )
32 })?;
33 Ok(TextMessage {
34 content: content.to_owned(),
35 msg_id,
36 })
37 }
38}
39
40#[test]
41pub fn parse() -> SdkResult<()> {
42 use roxmltree::Document;
43
44 let s = "<xml>
45 <ToUserName><![CDATA[toUser]]></ToUserName>
46 <FromUserName><![CDATA[fromUser]]></FromUserName>
47 <CreateTime>1348831860</CreateTime>
48 <MsgType><![CDATA[text]]></MsgType>
49 <Content><![CDATA[this is a test]]></Content>
50 <MsgId>1234567890123456</MsgId>
51 </xml>";
52 let node = Document::parse(&s)?;
53 let msg = TextMessage::from_xml(&node.root())?;
54 assert_eq!(msg.content, "this is a test");
55 assert_eq!(msg.msg_id, 1234567890123456);
56 Ok(())
57}