Skip to main content

wx_sdk/mp/event/msg_event/
event_guide.rs

1use crate::{
2    error::SdkError,
3    mp::event::{
4        xmlutil::{get_number_from_root, get_text_from_root},
5        ReceivedMessageParser,
6    },
7    SdkResult,
8};
9
10pub struct GuideInviteResultEvent {
11    pub guide_account: Option<String>,
12    pub guide_openid: Option<String>,
13    pub invite_result: i32,
14}
15
16impl ReceivedMessageParser for GuideInviteResultEvent {
17    type ReceivedMessage = GuideInviteResultEvent;
18
19    fn from_xml(node: &roxmltree::Node) -> SdkResult<Self::ReceivedMessage> {
20        let guide_invite_event = node
21            .descendants()
22            .find(|n| n.has_tag_name("GuideInviteEvent"))
23            .ok_or_else(|| {
24                SdkError::InvalidParams(format!(
25                    "Parse XML msg from wechat error: tag `{}` is none",
26                    "GuideInviteEvent"
27                ))
28            })?;
29        let guide_account = get_text_from_root(&guide_invite_event, "guide_account")
30            .ok()
31            .filter(|s| !s.trim().is_empty())
32            .map(|s| s.to_string());
33        let guide_openid = get_text_from_root(&guide_invite_event, "guide_openid")
34            .ok()
35            .filter(|s| !s.trim().is_empty())
36            .map(|s| s.to_string());
37        if guide_account.is_none() && guide_openid.is_none() {
38            return Err(SdkError::InvalidParams(format!("parse GuideInviteEvent error: guide_account and guide_openid should exist at least one of them.")));
39        }
40        let invite_result = get_number_from_root::<i32>(&guide_invite_event, "invite_result")?;
41        Ok(GuideInviteResultEvent {
42            guide_account,
43            guide_openid,
44            invite_result,
45        })
46    }
47}
48
49pub struct GuideQrcodeScanEvent {
50    pub qrcode_guide_account: Option<String>,
51    pub qrcode_guide_openid: Option<String>,
52    pub openid: String,
53    pub action: u8,
54    pub qrcode_info: String,
55}
56
57impl ReceivedMessageParser for GuideQrcodeScanEvent {
58    type ReceivedMessage = GuideQrcodeScanEvent;
59
60    fn from_xml(node: &roxmltree::Node) -> SdkResult<Self::ReceivedMessage> {
61        let guide_scan_event = node
62            .descendants()
63            .find(|n| n.has_tag_name("GuideScanEvent"))
64            .ok_or_else(|| {
65                SdkError::InvalidParams(format!(
66                    "Parse XML msg from wechat error: tag `{}` is none",
67                    "GuideScanEvent"
68                ))
69            })?;
70
71        let qrcode_guide_account = get_text_from_root(&guide_scan_event, "qrcode_guide_account")
72            .ok()
73            .filter(|s| !s.trim().is_empty())
74            .map(|s| s.to_string());
75        let qrcode_guide_openid = get_text_from_root(&guide_scan_event, "qrcode_guide_openid")
76            .ok()
77            .filter(|s| !s.trim().is_empty())
78            .map(|s| s.to_string());
79        if qrcode_guide_account.is_none() && qrcode_guide_openid.is_none() {
80            return Err(SdkError::InvalidParams(format!("parse GuideScanEvent error: qrcode_guide_account and qrcode_guide_openid should exist at least one of them.")));
81        }
82
83        let action = get_number_from_root::<u8>(&guide_scan_event, "action")?;
84        let openid = get_text_from_root(&guide_scan_event, "openid")?;
85        let qrcode_info = get_text_from_root(&guide_scan_event, "qrcode_info")?;
86        Ok(GuideQrcodeScanEvent {
87            qrcode_guide_account,
88            qrcode_guide_openid,
89            action,
90            openid: openid.to_string(),
91            qrcode_info: qrcode_info.to_string(),
92        })
93    }
94}
95
96#[cfg(test)]
97mod tests {
98    use super::*;
99    use crate::SdkResult;
100    #[test]
101    pub fn parse() -> SdkResult<()> {
102        use roxmltree::Document;
103        let s = "<xml>
104    <ToUserName><![CDATA[toUser]]></ToUserName>
105    <FromUserName><![CDATA[fromUser]]></FromUserName>
106    <CreateTime>1546924844</CreateTime>
107    <MsgType><![CDATA[event]]></MsgType>
108    <Event><![CDATA[guide_qrcode_scan_event]]></Event>
109    <GuideScanEvent>
110      <qrcode_guide_account><![CDATA[xxx]]></qrcode_guide_account>
111      <qrcode_guide_openid><![CDATA[xxx]]></qrcode_guide_openid>
112      <openid><![CDATA[xxx]]></openid>
113      <action>11</action>
114      <qrcode_info><![CDATA[xxx]]></qrcode_info>
115    </GuideScanEvent>
116  </xml>
117  ";
118        let node = Document::parse(&s)?;
119        let msg = GuideQrcodeScanEvent::from_xml(&node.root())?;
120        assert_eq!(msg.qrcode_guide_account, Some("xxx".to_string()));
121        assert_eq!(msg.action, 11);
122        assert_eq!(msg.qrcode_info, "xxx");
123        Ok(())
124    }
125}