Skip to main content

wx_sdk/mp/event/
msg_text.rs

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