wx_sdk/mp/event/msg_event/
mod.rs1use roxmltree::Node;
2
3use crate::SdkResult;
4
5use self::{
6 event_click::ClickEvent,
7 event_guide::{GuideInviteResultEvent, GuideQrcodeScanEvent},
8 event_location::LocationEvent,
9 event_publishjob::PublishJobFinishEvent,
10 event_scan::{MenuScanEvent, ScanEvent},
11 event_send::{SendLocationEvent, SendPicsEvent},
12 event_sendjob::{MassSendJobFinishEvent, TemplateSendJobFinishEvent},
13 event_subscribe::SubScribeEvent,
14 event_view::ViewEvent,
15};
16
17use super::{xmlutil::get_text_from_root, ReceivedMessageParser};
18
19pub mod event_click;
20pub mod event_guide;
21pub mod event_location;
22pub mod event_publishjob;
23pub mod event_scan;
24pub mod event_send;
25pub mod event_sendjob;
26pub mod event_subscribe;
27pub mod event_view;
28
29const EVENT_SUBSCRIBE: &'static str = "subscribe";
30const EVENT_UNSUBSCRIBE: &'static str = "unsubscribe";
31const EVENT_SCAN: &'static str = "SCAN";
32const EVENT_LOCATION: &'static str = "LOCATION"; const EVENT_CLICK: &'static str = "CLICK";
34const EVENT_VIEW: &'static str = "VIEW";
35const EVENT_SCANCODE_PUSH: &'static str = "scancode_push";
36const EVENT_SCANCODE_WAITMSG: &'static str = "scancode_waitmsg";
37const EVENT_PIC_SYSPHOTO: &'static str = "pic_sysphoto";
38const EVENT_PIC_PHOTO_OR_ALBUM: &'static str = "pic_photo_or_album";
39const EVENT_PIC_WEIXIN: &'static str = "pic_weixin";
40const EVENT_LOCATION_SELECT: &'static str = "location_select";
41const EVENT_VIEW_MINIPROGRAM: &'static str = "view_miniprogram";
42const EVENT_TEMPLATESENDJOBFINISH: &'static str = "TEMPLATESENDJOBFINISH";
43const EVENT_MASSSENDJOBFINISH: &'static str = "MASSSENDJOBFINISH";
44const EVENT_GUIDE_INVITE_RESULT: &'static str = "guide_invite_result_event";
45const EVENT_GUIDE_QRCODE_SCAN: &'static str = "guide_qrcode_scan_event";
46const EVENT_PUBLISHJOBFINISH: &'static str = "PUBLISHJOBFINISH";
47
48pub enum EventMessage {
49 Subscribe,
50 UnSubscribe,
51 SubscribeScan(ScanEvent),
52 Scan(ScanEvent),
53 Location(LocationEvent),
54 Click(ClickEvent),
55 View(ViewEvent),
56 ViewMiniProgram(ViewEvent),
57 ScanCodePush(MenuScanEvent),
58 ScanCodeWaitMsg(MenuScanEvent),
59 PicSysPhoto(SendPicsEvent),
60 PicPhotoOrAlbum(SendPicsEvent),
61 PicWeixin(SendPicsEvent),
62 LocationSelect(SendLocationEvent),
63 TemplateSendJobFinish(TemplateSendJobFinishEvent),
64 MassSendJobFinish(MassSendJobFinishEvent),
65 GuideInviteResult(GuideInviteResultEvent),
66 GuideQrcodeScan(GuideQrcodeScanEvent),
67 PublishJobFinish(PublishJobFinishEvent),
68 UnhandledEvent(String),
69}
70
71impl ReceivedMessageParser for EventMessage {
72 type ReceivedMessage = Self;
73
74 fn from_xml(node: &Node) -> SdkResult<Self::ReceivedMessage> {
75 let event_type = get_text_from_root(node, "Event")?;
76 let event = match event_type {
77 EVENT_SUBSCRIBE => SubScribeEvent::from_xml(node)?,
78 EVENT_UNSUBSCRIBE => EventMessage::UnSubscribe,
79 EVENT_SCAN => EventMessage::Scan(ScanEvent::from_xml(node)?),
80 EVENT_LOCATION => EventMessage::Location(LocationEvent::from_xml(node)?),
81 EVENT_CLICK => EventMessage::Click(ClickEvent::from_xml(node)?),
82 EVENT_VIEW => EventMessage::View(ViewEvent::from_xml(node)?),
83 EVENT_VIEW_MINIPROGRAM => EventMessage::ViewMiniProgram(ViewEvent::from_xml(node)?),
84 EVENT_SCANCODE_PUSH => EventMessage::ScanCodePush(MenuScanEvent::from_xml(node)?),
85 EVENT_SCANCODE_WAITMSG => EventMessage::ScanCodeWaitMsg(MenuScanEvent::from_xml(node)?),
86 EVENT_PIC_SYSPHOTO => EventMessage::PicSysPhoto(SendPicsEvent::from_xml(node)?),
87 EVENT_PIC_PHOTO_OR_ALBUM => {
88 EventMessage::PicPhotoOrAlbum(SendPicsEvent::from_xml(node)?)
89 }
90 EVENT_PIC_WEIXIN => EventMessage::PicWeixin(SendPicsEvent::from_xml(node)?),
91 EVENT_LOCATION_SELECT => {
92 EventMessage::LocationSelect(SendLocationEvent::from_xml(node)?)
93 }
94 EVENT_MASSSENDJOBFINISH => {
95 EventMessage::MassSendJobFinish(MassSendJobFinishEvent::from_xml(node)?)
96 }
97 EVENT_TEMPLATESENDJOBFINISH => {
98 EventMessage::TemplateSendJobFinish(TemplateSendJobFinishEvent::from_xml(node)?)
99 }
100 EVENT_GUIDE_INVITE_RESULT => {
101 EventMessage::GuideInviteResult(GuideInviteResultEvent::from_xml(node)?)
102 }
103 EVENT_GUIDE_QRCODE_SCAN => {
104 EventMessage::GuideQrcodeScan(GuideQrcodeScanEvent::from_xml(node)?)
105 }
106 EVENT_PUBLISHJOBFINISH => {
107 EventMessage::PublishJobFinish(PublishJobFinishEvent::from_xml(node)?)
108 }
109 _ => EventMessage::UnhandledEvent(format!("unhandle this event type: {}", event_type)),
110 };
111 Ok(event)
112 }
113}
114
115impl EventMessage {
116 pub fn get_event_type(&self) -> &'static str {
117 match self {
118 EventMessage::Subscribe => EVENT_SUBSCRIBE,
119 EventMessage::UnSubscribe => EVENT_UNSUBSCRIBE,
120 EventMessage::SubscribeScan(_) => EVENT_SUBSCRIBE,
121 EventMessage::Scan(_) => EVENT_SCAN,
122 EventMessage::Location(_) => EVENT_LOCATION,
123 EventMessage::Click(_) => EVENT_CLICK,
124 EventMessage::View(_) => EVENT_VIEW,
125 EventMessage::ViewMiniProgram(_) => EVENT_VIEW_MINIPROGRAM,
126 EventMessage::ScanCodePush(_) => EVENT_SCANCODE_PUSH,
127 EventMessage::ScanCodeWaitMsg(_) => EVENT_SCANCODE_WAITMSG,
128 EventMessage::PicSysPhoto(_) => EVENT_PIC_SYSPHOTO,
129 EventMessage::PicPhotoOrAlbum(_) => EVENT_PIC_PHOTO_OR_ALBUM,
130 EventMessage::PicWeixin(_) => EVENT_PIC_WEIXIN,
131 EventMessage::LocationSelect(_) => EVENT_LOCATION_SELECT,
132 EventMessage::TemplateSendJobFinish(_) => EVENT_TEMPLATESENDJOBFINISH,
133 EventMessage::MassSendJobFinish(_) => EVENT_MASSSENDJOBFINISH,
134 EventMessage::GuideInviteResult(_) => EVENT_GUIDE_INVITE_RESULT,
135 EventMessage::GuideQrcodeScan(_) => EVENT_GUIDE_QRCODE_SCAN,
136 EventMessage::PublishJobFinish(_) => EVENT_PUBLISHJOBFINISH,
137 EventMessage::UnhandledEvent(_) => "UnhandledEvent",
138 }
139 }
140}