1use crate::{commands::*, responses::*, utils::CommandSyntax, *};
2use std::future::Future;
3use std::sync::Arc;
4
5pub trait ClientApiError: From<BadResponseError> + std::error::Error {
6 fn bad_response_mut(&mut self) -> Option<&mut BadResponseError>;
10}
11
12pub trait ClientApi: Sync {
13 type Error: ClientApiError;
14
15 fn send_raw(
16 &self,
17 command: String,
18 ) -> impl Future<Output = Result<JsonObject, Self::Error>> + Send;
19
20 fn api_create_my_address(
36 &self,
37 user_id: i64,
38 ) -> impl Future<Output = Result<Arc<UserContactLinkCreatedResponse>, Self::Error>> + Send {
39 async move {
40 let command = ApiCreateMyAddress { user_id };
41 let json = self.send_raw(command.interpret()).await?;
42 let response = serde_json::from_value(json).unwrap();
44 match response {
45 ApiCreateMyAddressResponse::UserContactLinkCreated(resp) => Ok(Arc::new(resp)),
46 ApiCreateMyAddressResponse::ChatCmdError(resp) => {
47 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
48 }
49 ApiCreateMyAddressResponse::Undocumented(resp) => {
50 Err(BadResponseError::Undocumented(resp).into())
51 }
52 }
53 }
54 }
55
56 fn api_delete_my_address(
72 &self,
73 user_id: i64,
74 ) -> impl Future<Output = Result<Arc<UserContactLinkDeletedResponse>, Self::Error>> + Send {
75 async move {
76 let command = ApiDeleteMyAddress { user_id };
77 let json = self.send_raw(command.interpret()).await?;
78 let response = serde_json::from_value(json).unwrap();
80 match response {
81 ApiDeleteMyAddressResponse::UserContactLinkDeleted(resp) => Ok(Arc::new(resp)),
82 ApiDeleteMyAddressResponse::ChatCmdError(resp) => {
83 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
84 }
85 ApiDeleteMyAddressResponse::Undocumented(resp) => {
86 Err(BadResponseError::Undocumented(resp).into())
87 }
88 }
89 }
90 }
91
92 fn api_show_my_address(
108 &self,
109 user_id: i64,
110 ) -> impl Future<Output = Result<Arc<UserContactLinkResponse>, Self::Error>> + Send {
111 async move {
112 let command = ApiShowMyAddress { user_id };
113 let json = self.send_raw(command.interpret()).await?;
114 let response = serde_json::from_value(json).unwrap();
116 match response {
117 ApiShowMyAddressResponse::UserContactLink(resp) => Ok(Arc::new(resp)),
118 ApiShowMyAddressResponse::ChatCmdError(resp) => {
119 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
120 }
121 ApiShowMyAddressResponse::Undocumented(resp) => {
122 Err(BadResponseError::Undocumented(resp).into())
123 }
124 }
125 }
126 }
127
128 fn api_set_profile_address(
144 &self,
145 command: ApiSetProfileAddress,
146 ) -> impl Future<Output = Result<Arc<UserProfileUpdatedResponse>, Self::Error>> + Send {
147 async move {
148 let json = self.send_raw(command.interpret()).await?;
149 let response = serde_json::from_value(json).unwrap();
151 match response {
152 ApiSetProfileAddressResponse::UserProfileUpdated(resp) => Ok(Arc::new(resp)),
153 ApiSetProfileAddressResponse::ChatCmdError(resp) => {
154 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
155 }
156 ApiSetProfileAddressResponse::Undocumented(resp) => {
157 Err(BadResponseError::Undocumented(resp).into())
158 }
159 }
160 }
161 }
162
163 fn api_set_address_settings(
179 &self,
180 user_id: i64,
181 settings: AddressSettings,
182 ) -> impl Future<Output = Result<Arc<UserContactLinkUpdatedResponse>, Self::Error>> + Send {
183 async move {
184 let command = ApiSetAddressSettings { user_id, settings };
185 let json = self.send_raw(command.interpret()).await?;
186 let response = serde_json::from_value(json).unwrap();
188 match response {
189 ApiSetAddressSettingsResponse::UserContactLinkUpdated(resp) => Ok(Arc::new(resp)),
190 ApiSetAddressSettingsResponse::ChatCmdError(resp) => {
191 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
192 }
193 ApiSetAddressSettingsResponse::Undocumented(resp) => {
194 Err(BadResponseError::Undocumented(resp).into())
195 }
196 }
197 }
198 }
199
200 fn api_send_messages(
216 &self,
217 command: ApiSendMessages,
218 ) -> impl Future<Output = Result<Arc<NewChatItemsResponse>, Self::Error>> + Send {
219 async move {
220 let json = self.send_raw(command.interpret()).await?;
221 let response = serde_json::from_value(json).unwrap();
223 match response {
224 ApiSendMessagesResponse::NewChatItems(resp) => Ok(Arc::new(resp)),
225 ApiSendMessagesResponse::ChatCmdError(resp) => {
226 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
227 }
228 ApiSendMessagesResponse::Undocumented(resp) => {
229 Err(BadResponseError::Undocumented(resp).into())
230 }
231 }
232 }
233 }
234
235 fn api_update_chat_item(
251 &self,
252 command: ApiUpdateChatItem,
253 ) -> impl Future<Output = Result<ApiUpdateChatItemResponses, Self::Error>> + Send {
254 async move {
255 let json = self.send_raw(command.interpret()).await?;
256 let response = serde_json::from_value(json).unwrap();
258 match response {
259 ApiUpdateChatItemResponse::ChatItemUpdated(resp) => {
260 Ok(ApiUpdateChatItemResponses::ChatItemUpdated(Arc::new(resp)))
261 }
262 ApiUpdateChatItemResponse::ChatItemNotChanged(resp) => Ok(
263 ApiUpdateChatItemResponses::ChatItemNotChanged(Arc::new(resp)),
264 ),
265 ApiUpdateChatItemResponse::ChatCmdError(resp) => {
266 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
267 }
268 ApiUpdateChatItemResponse::Undocumented(resp) => {
269 Err(BadResponseError::Undocumented(resp).into())
270 }
271 }
272 }
273 }
274
275 fn api_delete_chat_item(
291 &self,
292 chat_ref: ChatRef,
293 chat_item_ids: Vec<i64>,
294 delete_mode: CIDeleteMode,
295 ) -> impl Future<Output = Result<Arc<ChatItemsDeletedResponse>, Self::Error>> + Send {
296 async move {
297 let command = ApiDeleteChatItem {
298 chat_ref,
299 chat_item_ids,
300 delete_mode,
301 };
302 let json = self.send_raw(command.interpret()).await?;
303 let response = serde_json::from_value(json).unwrap();
305 match response {
306 ApiDeleteChatItemResponse::ChatItemsDeleted(resp) => Ok(Arc::new(resp)),
307 ApiDeleteChatItemResponse::ChatCmdError(resp) => {
308 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
309 }
310 ApiDeleteChatItemResponse::Undocumented(resp) => {
311 Err(BadResponseError::Undocumented(resp).into())
312 }
313 }
314 }
315 }
316
317 fn api_delete_member_chat_item(
333 &self,
334 group_id: i64,
335 chat_item_ids: Vec<i64>,
336 ) -> impl Future<Output = Result<Arc<ChatItemsDeletedResponse>, Self::Error>> + Send {
337 async move {
338 let command = ApiDeleteMemberChatItem {
339 group_id,
340 chat_item_ids,
341 };
342 let json = self.send_raw(command.interpret()).await?;
343 let response = serde_json::from_value(json).unwrap();
345 match response {
346 ApiDeleteMemberChatItemResponse::ChatItemsDeleted(resp) => Ok(Arc::new(resp)),
347 ApiDeleteMemberChatItemResponse::ChatCmdError(resp) => {
348 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
349 }
350 ApiDeleteMemberChatItemResponse::Undocumented(resp) => {
351 Err(BadResponseError::Undocumented(resp).into())
352 }
353 }
354 }
355 }
356
357 fn api_chat_item_reaction(
373 &self,
374 command: ApiChatItemReaction,
375 ) -> impl Future<Output = Result<Arc<ChatItemReactionResponse>, Self::Error>> + Send {
376 async move {
377 let json = self.send_raw(command.interpret()).await?;
378 let response = serde_json::from_value(json).unwrap();
380 match response {
381 ApiChatItemReactionResponse::ChatItemReaction(resp) => Ok(Arc::new(resp)),
382 ApiChatItemReactionResponse::ChatCmdError(resp) => {
383 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
384 }
385 ApiChatItemReactionResponse::Undocumented(resp) => {
386 Err(BadResponseError::Undocumented(resp).into())
387 }
388 }
389 }
390 }
391
392 fn receive_file(
408 &self,
409 command: ReceiveFile,
410 ) -> impl Future<Output = Result<ReceiveFileResponses, Self::Error>> + Send {
411 async move {
412 let json = self.send_raw(command.interpret()).await?;
413 let response = serde_json::from_value(json).unwrap();
415 match response {
416 ReceiveFileResponse::RcvFileAccepted(resp) => {
417 Ok(ReceiveFileResponses::RcvFileAccepted(Arc::new(resp)))
418 }
419 ReceiveFileResponse::RcvFileAcceptedSndCancelled(resp) => Ok(
420 ReceiveFileResponses::RcvFileAcceptedSndCancelled(Arc::new(resp)),
421 ),
422 ReceiveFileResponse::ChatCmdError(resp) => {
423 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
424 }
425 ReceiveFileResponse::Undocumented(resp) => {
426 Err(BadResponseError::Undocumented(resp).into())
427 }
428 }
429 }
430 }
431
432 fn cancel_file(
448 &self,
449 file_id: i64,
450 ) -> impl Future<Output = Result<CancelFileResponses, Self::Error>> + Send {
451 async move {
452 let command = CancelFile { file_id };
453 let json = self.send_raw(command.interpret()).await?;
454 let response = serde_json::from_value(json).unwrap();
456 match response {
457 CancelFileResponse::SndFileCancelled(resp) => {
458 Ok(CancelFileResponses::SndFileCancelled(Arc::new(resp)))
459 }
460 CancelFileResponse::RcvFileCancelled(resp) => {
461 Ok(CancelFileResponses::RcvFileCancelled(Arc::new(resp)))
462 }
463 CancelFileResponse::ChatCmdError(resp) => {
464 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
465 }
466 CancelFileResponse::Undocumented(resp) => {
467 Err(BadResponseError::Undocumented(resp).into())
468 }
469 }
470 }
471 }
472
473 fn api_add_member(
489 &self,
490 group_id: i64,
491 contact_id: i64,
492 member_role: GroupMemberRole,
493 ) -> impl Future<Output = Result<Arc<SentGroupInvitationResponse>, Self::Error>> + Send {
494 async move {
495 let command = ApiAddMember {
496 group_id,
497 contact_id,
498 member_role,
499 };
500 let json = self.send_raw(command.interpret()).await?;
501 let response = serde_json::from_value(json).unwrap();
503 match response {
504 ApiAddMemberResponse::SentGroupInvitation(resp) => Ok(Arc::new(resp)),
505 ApiAddMemberResponse::ChatCmdError(resp) => {
506 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
507 }
508 ApiAddMemberResponse::Undocumented(resp) => {
509 Err(BadResponseError::Undocumented(resp).into())
510 }
511 }
512 }
513 }
514
515 fn api_join_group(
531 &self,
532 group_id: i64,
533 ) -> impl Future<Output = Result<Arc<UserAcceptedGroupSentResponse>, Self::Error>> + Send {
534 async move {
535 let command = ApiJoinGroup { group_id };
536 let json = self.send_raw(command.interpret()).await?;
537 let response = serde_json::from_value(json).unwrap();
539 match response {
540 ApiJoinGroupResponse::UserAcceptedGroupSent(resp) => Ok(Arc::new(resp)),
541 ApiJoinGroupResponse::ChatCmdError(resp) => {
542 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
543 }
544 ApiJoinGroupResponse::Undocumented(resp) => {
545 Err(BadResponseError::Undocumented(resp).into())
546 }
547 }
548 }
549 }
550
551 fn api_accept_member(
567 &self,
568 group_id: i64,
569 group_member_id: i64,
570 member_role: GroupMemberRole,
571 ) -> impl Future<Output = Result<Arc<MemberAcceptedResponse>, Self::Error>> + Send {
572 async move {
573 let command = ApiAcceptMember {
574 group_id,
575 group_member_id,
576 member_role,
577 };
578 let json = self.send_raw(command.interpret()).await?;
579 let response = serde_json::from_value(json).unwrap();
581 match response {
582 ApiAcceptMemberResponse::MemberAccepted(resp) => Ok(Arc::new(resp)),
583 ApiAcceptMemberResponse::ChatCmdError(resp) => {
584 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
585 }
586 ApiAcceptMemberResponse::Undocumented(resp) => {
587 Err(BadResponseError::Undocumented(resp).into())
588 }
589 }
590 }
591 }
592
593 fn api_members_role(
609 &self,
610 group_id: i64,
611 group_member_ids: Vec<i64>,
612 member_role: GroupMemberRole,
613 ) -> impl Future<Output = Result<Arc<MembersRoleUserResponse>, Self::Error>> + Send {
614 async move {
615 let command = ApiMembersRole {
616 group_id,
617 group_member_ids,
618 member_role,
619 };
620 let json = self.send_raw(command.interpret()).await?;
621 let response = serde_json::from_value(json).unwrap();
623 match response {
624 ApiMembersRoleResponse::MembersRoleUser(resp) => Ok(Arc::new(resp)),
625 ApiMembersRoleResponse::ChatCmdError(resp) => {
626 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
627 }
628 ApiMembersRoleResponse::Undocumented(resp) => {
629 Err(BadResponseError::Undocumented(resp).into())
630 }
631 }
632 }
633 }
634
635 fn api_block_members_for_all(
651 &self,
652 command: ApiBlockMembersForAll,
653 ) -> impl Future<Output = Result<Arc<MembersBlockedForAllUserResponse>, Self::Error>> + Send
654 {
655 async move {
656 let json = self.send_raw(command.interpret()).await?;
657 let response = serde_json::from_value(json).unwrap();
659 match response {
660 ApiBlockMembersForAllResponse::MembersBlockedForAllUser(resp) => Ok(Arc::new(resp)),
661 ApiBlockMembersForAllResponse::ChatCmdError(resp) => {
662 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
663 }
664 ApiBlockMembersForAllResponse::Undocumented(resp) => {
665 Err(BadResponseError::Undocumented(resp).into())
666 }
667 }
668 }
669 }
670
671 fn api_remove_members(
687 &self,
688 command: ApiRemoveMembers,
689 ) -> impl Future<Output = Result<Arc<UserDeletedMembersResponse>, Self::Error>> + Send {
690 async move {
691 let json = self.send_raw(command.interpret()).await?;
692 let response = serde_json::from_value(json).unwrap();
694 match response {
695 ApiRemoveMembersResponse::UserDeletedMembers(resp) => Ok(Arc::new(resp)),
696 ApiRemoveMembersResponse::ChatCmdError(resp) => {
697 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
698 }
699 ApiRemoveMembersResponse::Undocumented(resp) => {
700 Err(BadResponseError::Undocumented(resp).into())
701 }
702 }
703 }
704 }
705
706 fn api_leave_group(
722 &self,
723 group_id: i64,
724 ) -> impl Future<Output = Result<Arc<LeftMemberUserResponse>, Self::Error>> + Send {
725 async move {
726 let command = ApiLeaveGroup { group_id };
727 let json = self.send_raw(command.interpret()).await?;
728 let response = serde_json::from_value(json).unwrap();
730 match response {
731 ApiLeaveGroupResponse::LeftMemberUser(resp) => Ok(Arc::new(resp)),
732 ApiLeaveGroupResponse::ChatCmdError(resp) => {
733 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
734 }
735 ApiLeaveGroupResponse::Undocumented(resp) => {
736 Err(BadResponseError::Undocumented(resp).into())
737 }
738 }
739 }
740 }
741
742 fn api_list_members(
758 &self,
759 group_id: i64,
760 ) -> impl Future<Output = Result<Arc<GroupMembersResponse>, Self::Error>> + Send {
761 async move {
762 let command = ApiListMembers { group_id };
763 let json = self.send_raw(command.interpret()).await?;
764 let response = serde_json::from_value(json).unwrap();
766 match response {
767 ApiListMembersResponse::GroupMembers(resp) => Ok(Arc::new(resp)),
768 ApiListMembersResponse::ChatCmdError(resp) => {
769 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
770 }
771 ApiListMembersResponse::Undocumented(resp) => {
772 Err(BadResponseError::Undocumented(resp).into())
773 }
774 }
775 }
776 }
777
778 fn api_new_group(
794 &self,
795 command: ApiNewGroup,
796 ) -> impl Future<Output = Result<Arc<GroupCreatedResponse>, Self::Error>> + Send {
797 async move {
798 let json = self.send_raw(command.interpret()).await?;
799 let response = serde_json::from_value(json).unwrap();
801 match response {
802 ApiNewGroupResponse::GroupCreated(resp) => Ok(Arc::new(resp)),
803 ApiNewGroupResponse::ChatCmdError(resp) => {
804 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
805 }
806 ApiNewGroupResponse::Undocumented(resp) => {
807 Err(BadResponseError::Undocumented(resp).into())
808 }
809 }
810 }
811 }
812
813 fn api_update_group_profile(
829 &self,
830 group_id: i64,
831 group_profile: GroupProfile,
832 ) -> impl Future<Output = Result<Arc<GroupUpdatedResponse>, Self::Error>> + Send {
833 async move {
834 let command = ApiUpdateGroupProfile {
835 group_id,
836 group_profile,
837 };
838 let json = self.send_raw(command.interpret()).await?;
839 let response = serde_json::from_value(json).unwrap();
841 match response {
842 ApiUpdateGroupProfileResponse::GroupUpdated(resp) => Ok(Arc::new(resp)),
843 ApiUpdateGroupProfileResponse::ChatCmdError(resp) => {
844 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
845 }
846 ApiUpdateGroupProfileResponse::Undocumented(resp) => {
847 Err(BadResponseError::Undocumented(resp).into())
848 }
849 }
850 }
851 }
852
853 fn api_create_group_link(
869 &self,
870 group_id: i64,
871 member_role: GroupMemberRole,
872 ) -> impl Future<Output = Result<Arc<GroupLinkCreatedResponse>, Self::Error>> + Send {
873 async move {
874 let command = ApiCreateGroupLink {
875 group_id,
876 member_role,
877 };
878 let json = self.send_raw(command.interpret()).await?;
879 let response = serde_json::from_value(json).unwrap();
881 match response {
882 ApiCreateGroupLinkResponse::GroupLinkCreated(resp) => Ok(Arc::new(resp)),
883 ApiCreateGroupLinkResponse::ChatCmdError(resp) => {
884 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
885 }
886 ApiCreateGroupLinkResponse::Undocumented(resp) => {
887 Err(BadResponseError::Undocumented(resp).into())
888 }
889 }
890 }
891 }
892
893 fn api_group_link_member_role(
909 &self,
910 group_id: i64,
911 member_role: GroupMemberRole,
912 ) -> impl Future<Output = Result<Arc<GroupLinkResponse>, Self::Error>> + Send {
913 async move {
914 let command = ApiGroupLinkMemberRole {
915 group_id,
916 member_role,
917 };
918 let json = self.send_raw(command.interpret()).await?;
919 let response = serde_json::from_value(json).unwrap();
921 match response {
922 ApiGroupLinkMemberRoleResponse::GroupLink(resp) => Ok(Arc::new(resp)),
923 ApiGroupLinkMemberRoleResponse::ChatCmdError(resp) => {
924 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
925 }
926 ApiGroupLinkMemberRoleResponse::Undocumented(resp) => {
927 Err(BadResponseError::Undocumented(resp).into())
928 }
929 }
930 }
931 }
932
933 fn api_delete_group_link(
949 &self,
950 group_id: i64,
951 ) -> impl Future<Output = Result<Arc<GroupLinkDeletedResponse>, Self::Error>> + Send {
952 async move {
953 let command = ApiDeleteGroupLink { group_id };
954 let json = self.send_raw(command.interpret()).await?;
955 let response = serde_json::from_value(json).unwrap();
957 match response {
958 ApiDeleteGroupLinkResponse::GroupLinkDeleted(resp) => Ok(Arc::new(resp)),
959 ApiDeleteGroupLinkResponse::ChatCmdError(resp) => {
960 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
961 }
962 ApiDeleteGroupLinkResponse::Undocumented(resp) => {
963 Err(BadResponseError::Undocumented(resp).into())
964 }
965 }
966 }
967 }
968
969 fn api_get_group_link(
985 &self,
986 group_id: i64,
987 ) -> impl Future<Output = Result<Arc<GroupLinkResponse>, Self::Error>> + Send {
988 async move {
989 let command = ApiGetGroupLink { group_id };
990 let json = self.send_raw(command.interpret()).await?;
991 let response = serde_json::from_value(json).unwrap();
993 match response {
994 ApiGetGroupLinkResponse::GroupLink(resp) => Ok(Arc::new(resp)),
995 ApiGetGroupLinkResponse::ChatCmdError(resp) => {
996 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
997 }
998 ApiGetGroupLinkResponse::Undocumented(resp) => {
999 Err(BadResponseError::Undocumented(resp).into())
1000 }
1001 }
1002 }
1003 }
1004
1005 fn api_add_contact(
1021 &self,
1022 command: ApiAddContact,
1023 ) -> impl Future<Output = Result<Arc<InvitationResponse>, Self::Error>> + Send {
1024 async move {
1025 let json = self.send_raw(command.interpret()).await?;
1026 let response = serde_json::from_value(json).unwrap();
1028 match response {
1029 ApiAddContactResponse::Invitation(resp) => Ok(Arc::new(resp)),
1030 ApiAddContactResponse::ChatCmdError(resp) => {
1031 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
1032 }
1033 ApiAddContactResponse::Undocumented(resp) => {
1034 Err(BadResponseError::Undocumented(resp).into())
1035 }
1036 }
1037 }
1038 }
1039
1040 fn api_connect_plan(
1056 &self,
1057 command: ApiConnectPlan,
1058 ) -> impl Future<Output = Result<Arc<ConnectionPlanResponse>, Self::Error>> + Send {
1059 async move {
1060 let json = self.send_raw(command.interpret()).await?;
1061 let response = serde_json::from_value(json).unwrap();
1063 match response {
1064 ApiConnectPlanResponse::ConnectionPlan(resp) => Ok(Arc::new(resp)),
1065 ApiConnectPlanResponse::ChatCmdError(resp) => {
1066 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
1067 }
1068 ApiConnectPlanResponse::Undocumented(resp) => {
1069 Err(BadResponseError::Undocumented(resp).into())
1070 }
1071 }
1072 }
1073 }
1074
1075 fn api_connect(
1091 &self,
1092 command: ApiConnect,
1093 ) -> impl Future<Output = Result<ApiConnectResponses, Self::Error>> + Send {
1094 async move {
1095 let json = self.send_raw(command.interpret()).await?;
1096 let response = serde_json::from_value(json).unwrap();
1098 match response {
1099 ApiConnectResponse::SentConfirmation(resp) => {
1100 Ok(ApiConnectResponses::SentConfirmation(Arc::new(resp)))
1101 }
1102 ApiConnectResponse::ContactAlreadyExists(resp) => {
1103 Ok(ApiConnectResponses::ContactAlreadyExists(Arc::new(resp)))
1104 }
1105 ApiConnectResponse::SentInvitation(resp) => {
1106 Ok(ApiConnectResponses::SentInvitation(Arc::new(resp)))
1107 }
1108 ApiConnectResponse::ChatCmdError(resp) => {
1109 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
1110 }
1111 ApiConnectResponse::Undocumented(resp) => {
1112 Err(BadResponseError::Undocumented(resp).into())
1113 }
1114 }
1115 }
1116 }
1117
1118 fn connect(
1134 &self,
1135 command: Connect,
1136 ) -> impl Future<Output = Result<ConnectResponses, Self::Error>> + Send {
1137 async move {
1138 let json = self.send_raw(command.interpret()).await?;
1139 let response = serde_json::from_value(json).unwrap();
1141 match response {
1142 ConnectResponse::SentConfirmation(resp) => {
1143 Ok(ConnectResponses::SentConfirmation(Arc::new(resp)))
1144 }
1145 ConnectResponse::ContactAlreadyExists(resp) => {
1146 Ok(ConnectResponses::ContactAlreadyExists(Arc::new(resp)))
1147 }
1148 ConnectResponse::SentInvitation(resp) => {
1149 Ok(ConnectResponses::SentInvitation(Arc::new(resp)))
1150 }
1151 ConnectResponse::ChatCmdError(resp) => {
1152 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
1153 }
1154 ConnectResponse::Undocumented(resp) => {
1155 Err(BadResponseError::Undocumented(resp).into())
1156 }
1157 }
1158 }
1159 }
1160
1161 fn api_accept_contact(
1177 &self,
1178 contact_req_id: i64,
1179 ) -> impl Future<Output = Result<Arc<AcceptingContactRequestResponse>, Self::Error>> + Send
1180 {
1181 async move {
1182 let command = ApiAcceptContact { contact_req_id };
1183 let json = self.send_raw(command.interpret()).await?;
1184 let response = serde_json::from_value(json).unwrap();
1186 match response {
1187 ApiAcceptContactResponse::AcceptingContactRequest(resp) => Ok(Arc::new(resp)),
1188 ApiAcceptContactResponse::ChatCmdError(resp) => {
1189 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
1190 }
1191 ApiAcceptContactResponse::Undocumented(resp) => {
1192 Err(BadResponseError::Undocumented(resp).into())
1193 }
1194 }
1195 }
1196 }
1197
1198 fn api_reject_contact(
1214 &self,
1215 contact_req_id: i64,
1216 ) -> impl Future<Output = Result<Arc<ContactRequestRejectedResponse>, Self::Error>> + Send {
1217 async move {
1218 let command = ApiRejectContact { contact_req_id };
1219 let json = self.send_raw(command.interpret()).await?;
1220 let response = serde_json::from_value(json).unwrap();
1222 match response {
1223 ApiRejectContactResponse::ContactRequestRejected(resp) => Ok(Arc::new(resp)),
1224 ApiRejectContactResponse::ChatCmdError(resp) => {
1225 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
1226 }
1227 ApiRejectContactResponse::Undocumented(resp) => {
1228 Err(BadResponseError::Undocumented(resp).into())
1229 }
1230 }
1231 }
1232 }
1233
1234 fn api_list_contacts(
1250 &self,
1251 user_id: i64,
1252 ) -> impl Future<Output = Result<Arc<ContactsListResponse>, Self::Error>> + Send {
1253 async move {
1254 let command = ApiListContacts { user_id };
1255 let json = self.send_raw(command.interpret()).await?;
1256 let response = serde_json::from_value(json).unwrap();
1258 match response {
1259 ApiListContactsResponse::ContactsList(resp) => Ok(Arc::new(resp)),
1260 ApiListContactsResponse::ChatCmdError(resp) => {
1261 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
1262 }
1263 ApiListContactsResponse::Undocumented(resp) => {
1264 Err(BadResponseError::Undocumented(resp).into())
1265 }
1266 }
1267 }
1268 }
1269
1270 fn api_list_groups(
1286 &self,
1287 command: ApiListGroups,
1288 ) -> impl Future<Output = Result<Arc<GroupsListResponse>, Self::Error>> + Send {
1289 async move {
1290 let json = self.send_raw(command.interpret()).await?;
1291 let response = serde_json::from_value(json).unwrap();
1293 match response {
1294 ApiListGroupsResponse::GroupsList(resp) => Ok(Arc::new(resp)),
1295 ApiListGroupsResponse::ChatCmdError(resp) => {
1296 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
1297 }
1298 ApiListGroupsResponse::Undocumented(resp) => {
1299 Err(BadResponseError::Undocumented(resp).into())
1300 }
1301 }
1302 }
1303 }
1304
1305 fn api_delete_chat(
1321 &self,
1322 chat_ref: ChatRef,
1323 chat_delete_mode: ChatDeleteMode,
1324 ) -> impl Future<Output = Result<ApiDeleteChatResponses, Self::Error>> + Send {
1325 async move {
1326 let command = ApiDeleteChat {
1327 chat_ref,
1328 chat_delete_mode,
1329 };
1330 let json = self.send_raw(command.interpret()).await?;
1331 let response = serde_json::from_value(json).unwrap();
1333 match response {
1334 ApiDeleteChatResponse::ContactDeleted(resp) => {
1335 Ok(ApiDeleteChatResponses::ContactDeleted(Arc::new(resp)))
1336 }
1337 ApiDeleteChatResponse::ContactConnectionDeleted(resp) => Ok(
1338 ApiDeleteChatResponses::ContactConnectionDeleted(Arc::new(resp)),
1339 ),
1340 ApiDeleteChatResponse::GroupDeletedUser(resp) => {
1341 Ok(ApiDeleteChatResponses::GroupDeletedUser(Arc::new(resp)))
1342 }
1343 ApiDeleteChatResponse::ChatCmdError(resp) => {
1344 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
1345 }
1346 ApiDeleteChatResponse::Undocumented(resp) => {
1347 Err(BadResponseError::Undocumented(resp).into())
1348 }
1349 }
1350 }
1351 }
1352
1353 fn show_active_user(
1369 &self,
1370 ) -> impl Future<Output = Result<Arc<ActiveUserResponse>, Self::Error>> + Send {
1371 async move {
1372 let command = ShowActiveUser {};
1373 let json = self.send_raw(command.interpret()).await?;
1374 let response = serde_json::from_value(json).unwrap();
1376 match response {
1377 ShowActiveUserResponse::ActiveUser(resp) => Ok(Arc::new(resp)),
1378 ShowActiveUserResponse::ChatCmdError(resp) => {
1379 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
1380 }
1381 ShowActiveUserResponse::Undocumented(resp) => {
1382 Err(BadResponseError::Undocumented(resp).into())
1383 }
1384 }
1385 }
1386 }
1387
1388 fn create_active_user(
1404 &self,
1405 new_user: NewUser,
1406 ) -> impl Future<Output = Result<Arc<ActiveUserResponse>, Self::Error>> + Send {
1407 async move {
1408 let command = CreateActiveUser { new_user };
1409 let json = self.send_raw(command.interpret()).await?;
1410 let response = serde_json::from_value(json).unwrap();
1412 match response {
1413 CreateActiveUserResponse::ActiveUser(resp) => Ok(Arc::new(resp)),
1414 CreateActiveUserResponse::ChatCmdError(resp) => {
1415 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
1416 }
1417 CreateActiveUserResponse::Undocumented(resp) => {
1418 Err(BadResponseError::Undocumented(resp).into())
1419 }
1420 }
1421 }
1422 }
1423
1424 fn list_users(
1440 &self,
1441 ) -> impl Future<Output = Result<Arc<UsersListResponse>, Self::Error>> + Send {
1442 async move {
1443 let command = ListUsers {};
1444 let json = self.send_raw(command.interpret()).await?;
1445 let response = serde_json::from_value(json).unwrap();
1447 match response {
1448 ListUsersResponse::UsersList(resp) => Ok(Arc::new(resp)),
1449 ListUsersResponse::ChatCmdError(resp) => {
1450 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
1451 }
1452 ListUsersResponse::Undocumented(resp) => {
1453 Err(BadResponseError::Undocumented(resp).into())
1454 }
1455 }
1456 }
1457 }
1458
1459 fn api_set_active_user(
1475 &self,
1476 command: ApiSetActiveUser,
1477 ) -> impl Future<Output = Result<Arc<ActiveUserResponse>, Self::Error>> + Send {
1478 async move {
1479 let json = self.send_raw(command.interpret()).await?;
1480 let response = serde_json::from_value(json).unwrap();
1482 match response {
1483 ApiSetActiveUserResponse::ActiveUser(resp) => Ok(Arc::new(resp)),
1484 ApiSetActiveUserResponse::ChatCmdError(resp) => {
1485 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
1486 }
1487 ApiSetActiveUserResponse::Undocumented(resp) => {
1488 Err(BadResponseError::Undocumented(resp).into())
1489 }
1490 }
1491 }
1492 }
1493
1494 fn api_delete_user(
1510 &self,
1511 command: ApiDeleteUser,
1512 ) -> impl Future<Output = Result<Arc<CmdOkResponse>, Self::Error>> + Send {
1513 async move {
1514 let json = self.send_raw(command.interpret()).await?;
1515 let response = serde_json::from_value(json).unwrap();
1517 match response {
1518 ApiDeleteUserResponse::CmdOk(resp) => Ok(Arc::new(resp)),
1519 ApiDeleteUserResponse::ChatCmdError(resp) => {
1520 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
1521 }
1522 ApiDeleteUserResponse::Undocumented(resp) => {
1523 Err(BadResponseError::Undocumented(resp).into())
1524 }
1525 }
1526 }
1527 }
1528
1529 fn api_update_profile(
1545 &self,
1546 user_id: i64,
1547 profile: Profile,
1548 ) -> impl Future<Output = Result<ApiUpdateProfileResponses, Self::Error>> + Send {
1549 async move {
1550 let command = ApiUpdateProfile { user_id, profile };
1551 let json = self.send_raw(command.interpret()).await?;
1552 let response = serde_json::from_value(json).unwrap();
1554 match response {
1555 ApiUpdateProfileResponse::UserProfileUpdated(resp) => Ok(
1556 ApiUpdateProfileResponses::UserProfileUpdated(Arc::new(resp)),
1557 ),
1558 ApiUpdateProfileResponse::UserProfileNoChange(resp) => Ok(
1559 ApiUpdateProfileResponses::UserProfileNoChange(Arc::new(resp)),
1560 ),
1561 ApiUpdateProfileResponse::ChatCmdError(resp) => {
1562 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
1563 }
1564 ApiUpdateProfileResponse::Undocumented(resp) => {
1565 Err(BadResponseError::Undocumented(resp).into())
1566 }
1567 }
1568 }
1569 }
1570
1571 fn api_set_contact_prefs(
1587 &self,
1588 contact_id: i64,
1589 preferences: Preferences,
1590 ) -> impl Future<Output = Result<Arc<ContactPrefsUpdatedResponse>, Self::Error>> + Send {
1591 async move {
1592 let command = ApiSetContactPrefs {
1593 contact_id,
1594 preferences,
1595 };
1596 let json = self.send_raw(command.interpret()).await?;
1597 let response = serde_json::from_value(json).unwrap();
1599 match response {
1600 ApiSetContactPrefsResponse::ContactPrefsUpdated(resp) => Ok(Arc::new(resp)),
1601 ApiSetContactPrefsResponse::ChatCmdError(resp) => {
1602 Err(BadResponseError::ChatCmdError(Arc::new(resp)).into())
1603 }
1604 ApiSetContactPrefsResponse::Undocumented(resp) => {
1605 Err(BadResponseError::Undocumented(resp).into())
1606 }
1607 }
1608 }
1609 }
1610}
1611
1612#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1613#[serde(tag = "type")]
1614pub enum ApiUpdateChatItemResponses {
1615 #[serde(rename = "chatItemUpdated")]
1617 ChatItemUpdated(Arc<ChatItemUpdatedResponse>),
1618 #[serde(rename = "chatItemNotChanged")]
1620 ChatItemNotChanged(Arc<ChatItemNotChangedResponse>),
1621}
1622
1623impl ApiUpdateChatItemResponses {
1624 pub fn chat_item_updated(&self) -> Option<&ChatItemUpdatedResponse> {
1625 if let Self::ChatItemUpdated(ret) = self {
1626 Some(ret)
1627 } else {
1628 None
1629 }
1630 }
1631
1632 pub fn chat_item_not_changed(&self) -> Option<&ChatItemNotChangedResponse> {
1633 if let Self::ChatItemNotChanged(ret) = self {
1634 Some(ret)
1635 } else {
1636 None
1637 }
1638 }
1639}
1640
1641#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1642#[serde(tag = "type")]
1643pub enum ReceiveFileResponses {
1644 #[serde(rename = "rcvFileAccepted")]
1646 RcvFileAccepted(Arc<RcvFileAcceptedResponse>),
1647 #[serde(rename = "rcvFileAcceptedSndCancelled")]
1649 RcvFileAcceptedSndCancelled(Arc<RcvFileAcceptedSndCancelledResponse>),
1650}
1651
1652impl ReceiveFileResponses {
1653 pub fn rcv_file_accepted(&self) -> Option<&RcvFileAcceptedResponse> {
1654 if let Self::RcvFileAccepted(ret) = self {
1655 Some(ret)
1656 } else {
1657 None
1658 }
1659 }
1660
1661 pub fn rcv_file_accepted_snd_cancelled(&self) -> Option<&RcvFileAcceptedSndCancelledResponse> {
1662 if let Self::RcvFileAcceptedSndCancelled(ret) = self {
1663 Some(ret)
1664 } else {
1665 None
1666 }
1667 }
1668}
1669
1670#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1671#[serde(tag = "type")]
1672pub enum CancelFileResponses {
1673 #[serde(rename = "sndFileCancelled")]
1675 SndFileCancelled(Arc<SndFileCancelledResponse>),
1676 #[serde(rename = "rcvFileCancelled")]
1678 RcvFileCancelled(Arc<RcvFileCancelledResponse>),
1679}
1680
1681impl CancelFileResponses {
1682 pub fn snd_file_cancelled(&self) -> Option<&SndFileCancelledResponse> {
1683 if let Self::SndFileCancelled(ret) = self {
1684 Some(ret)
1685 } else {
1686 None
1687 }
1688 }
1689
1690 pub fn rcv_file_cancelled(&self) -> Option<&RcvFileCancelledResponse> {
1691 if let Self::RcvFileCancelled(ret) = self {
1692 Some(ret)
1693 } else {
1694 None
1695 }
1696 }
1697}
1698
1699#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1700#[serde(tag = "type")]
1701pub enum ApiConnectResponses {
1702 #[serde(rename = "sentConfirmation")]
1704 SentConfirmation(Arc<SentConfirmationResponse>),
1705 #[serde(rename = "contactAlreadyExists")]
1707 ContactAlreadyExists(Arc<ContactAlreadyExistsResponse>),
1708 #[serde(rename = "sentInvitation")]
1710 SentInvitation(Arc<SentInvitationResponse>),
1711}
1712
1713impl ApiConnectResponses {
1714 pub fn sent_confirmation(&self) -> Option<&SentConfirmationResponse> {
1715 if let Self::SentConfirmation(ret) = self {
1716 Some(ret)
1717 } else {
1718 None
1719 }
1720 }
1721
1722 pub fn contact_already_exists(&self) -> Option<&ContactAlreadyExistsResponse> {
1723 if let Self::ContactAlreadyExists(ret) = self {
1724 Some(ret)
1725 } else {
1726 None
1727 }
1728 }
1729
1730 pub fn sent_invitation(&self) -> Option<&SentInvitationResponse> {
1731 if let Self::SentInvitation(ret) = self {
1732 Some(ret)
1733 } else {
1734 None
1735 }
1736 }
1737}
1738
1739#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1740#[serde(tag = "type")]
1741pub enum ConnectResponses {
1742 #[serde(rename = "sentConfirmation")]
1744 SentConfirmation(Arc<SentConfirmationResponse>),
1745 #[serde(rename = "contactAlreadyExists")]
1747 ContactAlreadyExists(Arc<ContactAlreadyExistsResponse>),
1748 #[serde(rename = "sentInvitation")]
1750 SentInvitation(Arc<SentInvitationResponse>),
1751}
1752
1753impl ConnectResponses {
1754 pub fn sent_confirmation(&self) -> Option<&SentConfirmationResponse> {
1755 if let Self::SentConfirmation(ret) = self {
1756 Some(ret)
1757 } else {
1758 None
1759 }
1760 }
1761
1762 pub fn contact_already_exists(&self) -> Option<&ContactAlreadyExistsResponse> {
1763 if let Self::ContactAlreadyExists(ret) = self {
1764 Some(ret)
1765 } else {
1766 None
1767 }
1768 }
1769
1770 pub fn sent_invitation(&self) -> Option<&SentInvitationResponse> {
1771 if let Self::SentInvitation(ret) = self {
1772 Some(ret)
1773 } else {
1774 None
1775 }
1776 }
1777}
1778
1779#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1780#[serde(tag = "type")]
1781pub enum ApiDeleteChatResponses {
1782 #[serde(rename = "contactDeleted")]
1784 ContactDeleted(Arc<ContactDeletedResponse>),
1785 #[serde(rename = "contactConnectionDeleted")]
1787 ContactConnectionDeleted(Arc<ContactConnectionDeletedResponse>),
1788 #[serde(rename = "groupDeletedUser")]
1790 GroupDeletedUser(Arc<GroupDeletedUserResponse>),
1791}
1792
1793impl ApiDeleteChatResponses {
1794 pub fn contact_deleted(&self) -> Option<&ContactDeletedResponse> {
1795 if let Self::ContactDeleted(ret) = self {
1796 Some(ret)
1797 } else {
1798 None
1799 }
1800 }
1801
1802 pub fn contact_connection_deleted(&self) -> Option<&ContactConnectionDeletedResponse> {
1803 if let Self::ContactConnectionDeleted(ret) = self {
1804 Some(ret)
1805 } else {
1806 None
1807 }
1808 }
1809
1810 pub fn group_deleted_user(&self) -> Option<&GroupDeletedUserResponse> {
1811 if let Self::GroupDeletedUser(ret) = self {
1812 Some(ret)
1813 } else {
1814 None
1815 }
1816 }
1817}
1818
1819#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1820#[serde(tag = "type")]
1821pub enum ApiUpdateProfileResponses {
1822 #[serde(rename = "userProfileUpdated")]
1824 UserProfileUpdated(Arc<UserProfileUpdatedResponse>),
1825 #[serde(rename = "userProfileNoChange")]
1827 UserProfileNoChange(Arc<UserProfileNoChangeResponse>),
1828}
1829
1830impl ApiUpdateProfileResponses {
1831 pub fn user_profile_updated(&self) -> Option<&UserProfileUpdatedResponse> {
1832 if let Self::UserProfileUpdated(ret) = self {
1833 Some(ret)
1834 } else {
1835 None
1836 }
1837 }
1838
1839 pub fn user_profile_no_change(&self) -> Option<&UserProfileNoChangeResponse> {
1840 if let Self::UserProfileNoChange(ret) = self {
1841 Some(ret)
1842 } else {
1843 None
1844 }
1845 }
1846}
1847
1848#[derive(Debug)]
1849pub enum BadResponseError {
1850 ChatCmdError(Arc<ChatCmdErrorResponse>),
1851 Undocumented(BTreeMap<String, JsonObject>),
1852}
1853
1854impl std::error::Error for BadResponseError {}
1855
1856impl std::fmt::Display for BadResponseError {
1857 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1858 match self {
1859 Self::ChatCmdError(resp) => writeln!(
1860 f,
1861 "Bad server response:\n{}",
1862 serde_json::to_string_pretty(resp).unwrap()
1863 ),
1864 Self::Undocumented(resp) => writeln!(
1865 f,
1866 "Unexpected server response:\n{}",
1867 serde_json::to_string_pretty(resp).unwrap()
1868 ),
1869 }
1870 }
1871}
1872
1873pub enum UndocumentedResponse<T> {
1874 Documented(T),
1875 Undocumented(BTreeMap<String, JsonObject>),
1876}
1877
1878pub trait AllowUndocumentedResponses<T, E> {
1899 fn allow_undocumented(self) -> Result<UndocumentedResponse<T>, E>;
1900}
1901
1902impl<T, E> AllowUndocumentedResponses<T, E> for Result<T, E>
1903where
1904 E: ClientApiError,
1905{
1906 fn allow_undocumented(self) -> Result<UndocumentedResponse<T>, E> {
1907 match self {
1908 Ok(resp) => Ok(UndocumentedResponse::Documented(resp)),
1909 Err(mut e) => match e.bad_response_mut() {
1910 Some(BadResponseError::Undocumented(btree_map)) => Ok(
1911 UndocumentedResponse::Undocumented(std::mem::take(btree_map)),
1912 ),
1913 _ => Err(e),
1914 },
1915 }
1916 }
1917}