wx_sdk/mp/event/msg_event/
event_guide.rs1use 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}