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}