ruipay/wechat/cp/
msg_parser.rs

1use crate::{CpAppAdminChangeEvent, CpAuthCancelEvent, CpAuthChangeEvent, CpAuthCreateEvent, CpAutoActivateEvent, CpBatchJobResultEvent, CpChangeExternalContactEvent, CpContactCreatePartyEvent, CpContactCreateUserEvent, CpContactDeletePartyEvent, CpContactDeleteUserEvent, CpContactUpdatePartyEvent, CpContactUpdateTagEvent, CpContactUpdateUserEvent, CpEnterAgentEvent, CpImageMessage, CpLicensePaySuccessEvent, CpLicenseRefundEvent, CpLinkMessage, CpLocationEvent, CpLocationMessage, CpMenuClickEvent, CpMenuLocationSelectEvent, CpMenuPicPhotoOrAlbumEvent, CpMenuPicSysPhotoEvent, CpMenuPicWeixinEvent, CpMenuScanCodePushEvent, CpMenuScanCodeWaitMsgEvent, CpMenuViewEvent, CpMessage, CpOpenApprovalChangeEvent, CpShareAgentChangeEvent, CpShareChainChangeEvent, CpSubscribeEvent, CpTemplateCardEvent, CpTemplateCardMenuEvent, CpTextMessage, CpTicketEvent, CpTpContactCreatePartyEvent, CpTpContactCreateUserEvent, CpTpContactDeletePartyEvent, CpTpContactDeleteUserEvent, CpTpContactUpdatePartyEvent, CpTpContactUpdateTagEvent, CpTpContactUpdateUserEvent, CpUnknownMessage, CpUnlicensedNotifyEvent, CpVideoMessage, CpVoiceMessage, LabradorResult, XmlMessageParser};
2
3pub fn parse_cp_message<S: AsRef<str>>(xml: S) -> LabradorResult<CpMessage> {
4    let doc = serde_xml_rs::from_str::<serde_json::Value>(xml.as_ref())?;
5    let msg_type = doc["MsgType"]["$value"].as_str().unwrap_or_default();
6    let info_type = doc["InfoType"]["$value"].as_str().unwrap_or_default();
7    if !info_type.is_empty() {
8        let msg = match info_type {
9            "suite_ticket" => CpMessage::TicketEvent(CpTicketEvent::from_xml(xml.as_ref())?),
10            "create_auth" => CpMessage::AuthCreateEvent(CpAuthCreateEvent::from_xml(xml.as_ref())?),
11            "change_auth" => CpMessage::AuthChangeEvent(CpAuthChangeEvent::from_xml(xml.as_ref())?),
12            "cancel_auth" => CpMessage::AuthCancelEvent(CpAuthCancelEvent::from_xml(xml.as_ref())?),
13            "auto_activate" => CpMessage::AutoActivateEvent(CpAutoActivateEvent::from_xml(xml.as_ref())?),
14            "license_pay_success" => CpMessage::LicensePaySuccessEvent(CpLicensePaySuccessEvent::from_xml(xml.as_ref())?),
15            "license_refund" => CpMessage::LicenseRefundEvent(CpLicenseRefundEvent::from_xml(xml.as_ref())?),
16            "change_external_contact" => {
17                let change_type = doc["ChangeType"]["$value"].as_str().unwrap_or_default();
18                match change_type {
19                    "add_external_contact" => CpMessage::AddExternalContactEvent(CpChangeExternalContactEvent::from_xml(xml.as_ref())?),
20                    "edit_external_contact" => CpMessage::EditExternalContact(CpChangeExternalContactEvent::from_xml(xml.as_ref())?),
21                    "add_half_external_contact" => CpMessage::AddHalfExternalContact(CpChangeExternalContactEvent::from_xml(xml.as_ref())?),
22                    "del_external_contact" => CpMessage::DelExternalContact(CpChangeExternalContactEvent::from_xml(xml.as_ref())?),
23                    "del_follow_user" => CpMessage::DelFollowUser(CpChangeExternalContactEvent::from_xml(xml.as_ref())?),
24                    _ => CpMessage::UnknownMessage(CpUnknownMessage::from_xml(xml.as_ref())?),
25                }
26            }
27            "change_contact" => {
28                let change_type = doc["ChangeType"]["$value"].as_str().unwrap_or_default();
29                match change_type {
30                    "create_user" => CpMessage::TpContactCreateUserEvent(CpTpContactCreateUserEvent::from_xml(xml.as_ref())?),
31                    "update_user" => CpMessage::TpContactUpdateUserEvent(CpTpContactUpdateUserEvent::from_xml(xml.as_ref())?),
32                    "delete_user" => CpMessage::TpContactDeleteUserEvent(CpTpContactDeleteUserEvent::from_xml(xml.as_ref())?),
33                    "create_party" => CpMessage::TpContactCreatePartyEvent(CpTpContactCreatePartyEvent::from_xml(xml.as_ref())?),
34                    "update_party" => CpMessage::TpContactUpdatePartyEvent(CpTpContactUpdatePartyEvent::from_xml(xml.as_ref())?),
35                    "delete_party" => CpMessage::TpContactDeletePartyEvent(CpTpContactDeletePartyEvent::from_xml(xml.as_ref())?),
36                    "update_tag" => CpMessage::TpContactUpdateTagEvent(CpTpContactUpdateTagEvent::from_xml(xml.as_ref())?),
37                    _ => {
38                        let mut msg = CpUnknownMessage::from_xml(xml.as_ref())?;
39                        msg.raw = xml.as_ref().to_string().into();
40                        CpMessage::UnknownMessage(msg)
41                    }
42                }
43            }
44            _ => {
45                let mut msg = CpUnknownMessage::from_xml(xml.as_ref())?;
46                msg.raw = xml.as_ref().to_string().into();
47                CpMessage::UnknownMessage(msg)
48            }
49        };
50        return Ok(msg);
51    }
52    let msg = match msg_type {
53        "text" => CpMessage::TextMessage(CpTextMessage::from_xml(xml.as_ref())?),
54        "image" => CpMessage::ImageMessage(CpImageMessage::from_xml(xml.as_ref())?),
55        "voice" => CpMessage::VoiceMessage(CpVoiceMessage::from_xml(xml.as_ref())?),
56        "video" => CpMessage::VideoMessage(CpVideoMessage::from_xml(xml.as_ref())?),
57        "location" => CpMessage::LocationMessage(CpLocationMessage::from_xml(xml.as_ref())?),
58        "link" => CpMessage::LinkMessage(CpLinkMessage::from_xml(xml.as_ref())?),
59        "event" => {
60            let event_str = doc["Event"]["$value"].as_str().unwrap_or_default();
61            let change_type = doc["ChangeType"]["$value"].as_str().unwrap_or_default();
62            parse_event(&event_str.to_lowercase(), change_type, xml.as_ref())?
63        }
64        _ => CpMessage::UnknownMessage(CpUnknownMessage::from_xml(xml.as_ref())?),
65    };
66    Ok(msg)
67}
68
69fn parse_event(event: &str, change_type: &str, xml: &str) -> LabradorResult<CpMessage> {
70    let msg = match event {
71        "location" => CpMessage::LocationEvent(CpLocationEvent::from_xml(xml)?),
72        "subscribe" => CpMessage::SubscribeEvent(CpSubscribeEvent::from_xml(xml)?),
73        "enter_agent" => CpMessage::EnterAgentEvent(CpEnterAgentEvent::from_xml(xml)?),
74        "change_app_admin" => CpMessage::AppAdminChangeEvent(CpAppAdminChangeEvent::from_xml(xml)?),
75        "batch_job_result" => CpMessage::BatchJobResultEvent(CpBatchJobResultEvent::from_xml(xml)?),
76        "change_contact" => {
77            match change_type {
78                "create_user" => CpMessage::ContactCreateUserEvent(CpContactCreateUserEvent::from_xml(xml)?),
79                "update_user" => CpMessage::ContactUpdateUserEvent(CpContactUpdateUserEvent::from_xml(xml)?),
80                "delete_user" => CpMessage::ContactDeleteUserEvent(CpContactDeleteUserEvent::from_xml(xml)?),
81                "create_party" => CpMessage::ContactCreatePartyEvent(CpContactCreatePartyEvent::from_xml(xml)?),
82                "update_party" => CpMessage::ContactUpdatePartyEvent(CpContactUpdatePartyEvent::from_xml(xml)?),
83                "delete_party" => CpMessage::ContactDeletePartyEvent(CpContactDeletePartyEvent::from_xml(xml)?),
84                "update_tag" => CpMessage::ContactUpdateTagEvent(CpContactUpdateTagEvent::from_xml(xml)?),
85                _ => CpMessage::UnknownMessage(CpUnknownMessage::from_xml(xml)?),
86            }
87        }
88        "click" => CpMessage::MenuClickEvent(CpMenuClickEvent::from_xml(xml)?),
89        "view" => CpMessage::MenuViewEvent(CpMenuViewEvent::from_xml(xml)?),
90        "scancode_push" => CpMessage::MenuScanCodePushEvent(CpMenuScanCodePushEvent::from_xml(xml)?),
91        "scancode_waitmsg" => CpMessage::MenuScanCodeWaitMsgEvent(CpMenuScanCodeWaitMsgEvent::from_xml(xml)?),
92        "pic_sysphoto" => CpMessage::MenuPicSysPhotoEvent(CpMenuPicSysPhotoEvent::from_xml(xml)?),
93        "pic_photo_or_album" => CpMessage::MenuPicPhotoOrAlbumEvent(CpMenuPicPhotoOrAlbumEvent::from_xml(xml)?),
94        "pic_weixin" => CpMessage::MenuPicWeixinEvent(CpMenuPicWeixinEvent::from_xml(xml)?),
95        "location_select" => CpMessage::MenuLocationSelectEvent(CpMenuLocationSelectEvent::from_xml(xml)?),
96        "open_approval_change" => CpMessage::OpenApprovalChangeEvent(CpOpenApprovalChangeEvent::from_xml(xml)?),
97        "share_agent_change" => CpMessage::ShareAgentChangeEvent(CpShareAgentChangeEvent::from_xml(xml)?),
98        "share_chain_change" => CpMessage::ShareChainChangeEvent(CpShareChainChangeEvent::from_xml(xml)?),
99        "template_card_event" => CpMessage::TemplateCardEvent(CpTemplateCardEvent::from_xml(xml)?),
100        "template_card_menu_event" => CpMessage::TemplateCardMenuEvent(CpTemplateCardMenuEvent::from_xml(xml)?),
101        "unlicensed_notify" => CpMessage::UnlicensedNotifyEvent(CpUnlicensedNotifyEvent::from_xml(xml)?),
102        "change_external_contact" => {
103            match change_type {
104                "add_external_contact" => CpMessage::AddExternalContactEvent(CpChangeExternalContactEvent::from_xml(xml.as_ref())?),
105                "edit_external_contact" => CpMessage::EditExternalContact(CpChangeExternalContactEvent::from_xml(xml.as_ref())?),
106                "add_half_external_contact" => CpMessage::AddHalfExternalContact(CpChangeExternalContactEvent::from_xml(xml.as_ref())?),
107                "del_external_contact" => CpMessage::DelExternalContact(CpChangeExternalContactEvent::from_xml(xml.as_ref())?),
108                "del_follow_user" => CpMessage::DelFollowUser(CpChangeExternalContactEvent::from_xml(xml.as_ref())?),
109                _ => CpMessage::UnknownMessage(CpUnknownMessage::from_xml(xml)?),
110            }
111        }
112        _ => CpMessage::UnknownMessage(CpUnknownMessage::from_xml(xml)?),
113    };
114    Ok(msg)
115}