1use super::contact::ContactType;
2use super::empty::EmptyType;
3use super::link::LinkType;
4
5use super::list_abuse_report::{
6 CollectionListAbuseReport, ListAbuseReportBuilder, ListAbuseReportType,
7};
8use super::list_activity::{CollectionListActivity, ListActivityBuilder};
9use super::list_batch_members::{ListBatchParam, ListBatchResponse};
10use super::list_clients::{CollectionListClients, ListClientsBuilder};
11use super::list_growth_history::{
12 CollectionListGrowthHistory, ListGrowthHistoryBuilder, ListGrowthHistoryFilter,
13 ListGrowthHistoryType,
14};
15use super::list_interest_categories::{
16 CollectionListInterestCategories, InterestCategoryParam, ListInterestCategory,
17 ListInterestCategoryBuilder, ListInterestCategoryFilter,
18};
19use super::list_locations::{CollectionListLocations, ListLocationsBuilder};
20use super::list_members::{
21 CollectionListMembers, ListMember, ListMemberParams, ListMembersBuilder, ListMembersFilter,
22};
23use super::list_merge_fields::{
24 CollectionListMergeField, ListMergeField, ListMergeFieldBuilder, ListMergeFieldFilter,
25 ListMergeFieldParam,
26};
27use super::list_segments::{
28 CollectionListSegment, ListSegment, ListSegmentBuilder, ListSegmentFilter,
29};
30use super::list_signup_forms::{CollectionListSignupForm, ListSignupForm, ListSignupFormBuilder};
31use super::list_webhooks::{
32 CollectionListWebhooks, ListWebhooks, ListWebhooksBuilder, ListWebhooksParam,
33};
34use crate::api::{MailchimpApi, MailchimpApiUpdate};
35use crate::internal::error_type::MailchimpErrorType;
36use crate::internal::request::MailchimpResult;
37use crate::iter::MailchimpCollection;
38use crate::iter::{MalchimpIter, ResourceFilter, SimpleFilter};
39use log::error;
40use serde::{Deserialize, Serialize};
41use std::collections::HashMap;
42use std::rc::Rc;
43
44#[derive(Serialize, Deserialize, Debug, Clone)]
48pub struct CampaignDefaultsType {
49 #[serde(default, skip_serializing_if = "Option::is_none")]
51 pub from_name: Option<String>,
52 #[serde(default, skip_serializing_if = "Option::is_none")]
54 pub from_email: Option<String>,
55 #[serde(default, skip_serializing_if = "Option::is_none")]
57 pub subject: Option<String>,
58 #[serde(default, skip_serializing_if = "Option::is_none")]
60 pub language: Option<String>,
61}
62
63impl Default for CampaignDefaultsType {
64 fn default() -> Self {
65 CampaignDefaultsType {
66 from_name: None,
67 from_email: None,
68 subject: None,
69 language: None,
70 }
71 }
72}
73
74#[derive(Serialize, Deserialize, Debug, Clone)]
78pub struct StatisticsType {
79 #[serde(default, skip_serializing_if = "Option::is_none")]
81 pub member_count: Option<u64>,
82 #[serde(default, skip_serializing_if = "Option::is_none")]
84 pub unsubscribe_count: Option<u64>,
85 #[serde(default, skip_serializing_if = "Option::is_none")]
87 pub cleaned_count: Option<u64>,
88 #[serde(default, skip_serializing_if = "Option::is_none")]
90 pub member_count_since_send: Option<u64>,
91 #[serde(default, skip_serializing_if = "Option::is_none")]
93 pub unsubscribe_count_since_send: Option<u64>,
94 #[serde(default, skip_serializing_if = "Option::is_none")]
96 pub cleaned_count_since_send: Option<u64>,
97 #[serde(default, skip_serializing_if = "Option::is_none")]
99 pub campaign_count: Option<u64>,
100 #[serde(default, skip_serializing_if = "Option::is_none")]
103 pub campaign_last_sent: Option<String>,
104 #[serde(default, skip_serializing_if = "Option::is_none")]
106 pub merge_field_count: Option<u64>,
107 #[serde(default, skip_serializing_if = "Option::is_none")]
110 pub avg_sub_rate: Option<f32>,
111 #[serde(default, skip_serializing_if = "Option::is_none")]
114 pub avg_unsub_rate: Option<f32>,
115 #[serde(default, skip_serializing_if = "Option::is_none")]
118 pub target_sub_rate: Option<f32>,
119 #[serde(default, skip_serializing_if = "Option::is_none")]
122 pub open_rate: Option<f32>,
123 #[serde(default, skip_serializing_if = "Option::is_none")]
126 pub click_rate: Option<f32>,
127 #[serde(default, skip_serializing_if = "Option::is_none")]
129 pub last_sub_date: Option<String>,
130 #[serde(default, skip_serializing_if = "Option::is_none")]
132 pub last_unsub_date: Option<String>,
133}
134
135impl Default for StatisticsType {
136 fn default() -> Self {
137 StatisticsType {
138 member_count: None,
139 unsubscribe_count: None,
140 cleaned_count: None,
141 member_count_since_send: None,
142 unsubscribe_count_since_send: None,
143 cleaned_count_since_send: None,
144 campaign_count: None,
145 campaign_last_sent: None,
146 merge_field_count: None,
147 avg_sub_rate: None,
148 avg_unsub_rate: None,
149 target_sub_rate: None,
150 open_rate: None,
151 click_rate: None,
152 last_sub_date: None,
153 last_unsub_date: None,
154 }
155 }
156}
157
158#[derive(Serialize, Deserialize, Debug, Clone)]
165pub struct ListType {
166 #[serde(default, skip_serializing_if = "Option::is_none")]
168 pub id: Option<String>,
169 #[serde(default, skip_serializing_if = "Option::is_none")]
172 pub web_id: Option<u64>,
173 #[serde(default, skip_serializing_if = "Option::is_none")]
175 pub name: Option<String>,
176 #[serde(default, skip_serializing_if = "Option::is_none")]
178 pub contact: Option<ContactType>,
179 #[serde(default, skip_serializing_if = "Option::is_none")]
181 pub permission_reminder: Option<String>,
182 #[serde(default, skip_serializing_if = "Option::is_none")]
184 pub use_archive_bar: Option<bool>,
185 #[serde(default, skip_serializing_if = "Option::is_none")]
187 pub campaign_defaults: Option<CampaignDefaultsType>,
188 #[serde(default, skip_serializing_if = "Option::is_none")]
190 pub notify_on_subscribe: Option<String>,
191 #[serde(default, skip_serializing_if = "Option::is_none")]
193 pub notify_on_unsubscribe: Option<String>,
194 #[serde(default, skip_serializing_if = "Option::is_none")]
196 pub date_created: Option<String>,
197 #[serde(default, skip_serializing_if = "Option::is_none")]
199 pub list_rating: Option<u64>,
200 #[serde(default, skip_serializing_if = "Option::is_none")]
205 pub email_type_option: Option<bool>,
206 #[serde(default, skip_serializing_if = "Option::is_none")]
208 pub subscribe_url_short: Option<String>,
209 #[serde(default, skip_serializing_if = "Option::is_none")]
211 pub subscribe_url_long: Option<String>,
212 #[serde(default, skip_serializing_if = "Option::is_none")]
214 pub beamer_address: Option<String>,
215 #[serde(default, skip_serializing_if = "Option::is_none")]
217 pub visibility: Option<String>,
218 #[serde(default, skip_serializing_if = "Option::is_none")]
220 pub double_optin: Option<bool>,
221 #[serde(default, skip_serializing_if = "Option::is_none")]
224 pub has_welcome: Option<bool>,
225 #[serde(default, skip_serializing_if = "Option::is_none")]
227 pub marketing_permissions: Option<bool>,
228 #[serde(default, skip_serializing_if = "Option::is_none")]
230 pub modules: Option<Vec<String>>,
231 #[serde(default, skip_serializing_if = "Option::is_none")]
233 pub stats: Option<StatisticsType>,
234 #[serde(default, skip_serializing_if = "Option::is_none")]
236 pub _links: Option<Vec<LinkType>>,
237
238 #[serde(skip)]
239 _api: Rc<MailchimpApi>,
240}
241
242impl MailchimpApiUpdate for ListType {
246 fn set_api(&mut self, n_api: Rc<MailchimpApi>) {
250 self._api = n_api
251 }
252}
253
254#[derive(Serialize, Deserialize, Debug, Clone)]
261pub struct ListsType {
262 #[serde(default)]
264 pub lists: Vec<ListType>,
265 #[serde(default)]
267 pub total_items: u64,
268 #[serde(default)]
270 pub _links: Vec<LinkType>,
271}
272
273impl MailchimpCollection<ListType> for ListsType {
274 fn get_total_items(&self) -> u64 {
276 self.total_items
277 }
278 fn get_values(&self) -> Vec<ListType> {
280 self.lists.clone()
281 }
282}
283
284impl Default for ListsType {
285 fn default() -> Self {
286 ListsType {
287 lists: Vec::new(),
288 total_items: 0,
289 _links: Vec::new(),
290 }
291 }
292}
293
294impl ListType {
295 pub fn batch_list_members(&self, param: ListBatchParam) -> MailchimpResult<ListBatchResponse> {
299 let endpoint = self.get_base_endpoint();
301 self._api
302 .post::<ListBatchResponse, ListBatchParam>(&endpoint, param)
303 }
304
305 pub fn get_activity(
316 &self,
317 fields: Option<String>,
318 exclude_fields: Option<String>,
319 ) -> MalchimpIter<ListActivityBuilder> {
320 let endpoint = self.get_base_endpoint() + "/activity";
321 let mut filter_params = SimpleFilter::default();
322
323 if let Some(f) = fields {
324 filter_params.fields = Some(f);
325 }
326
327 if let Some(ex) = exclude_fields {
328 filter_params.exclude_fields = Some(ex);
329 }
330
331 match self
332 ._api
333 .get::<CollectionListActivity>(&endpoint, filter_params.build_payload())
334 {
335 Ok(collection) => MalchimpIter {
336 builder: ListActivityBuilder {},
337 data: collection.activity,
338 cur_filters: filter_params.clone(),
339 cur_it: 0,
340 total_items: collection.total_items,
341 api: self._api.clone(),
342 endpoint: endpoint.clone(),
343 },
344 Err(e) => {
345 error!( target: "mailchimp", "Get Activities: Response Error details: {:?}", e);
346 MalchimpIter {
347 builder: ListActivityBuilder {},
348 data: Vec::new(),
349 cur_filters: filter_params.clone(),
350 cur_it: 0,
351 total_items: 0,
352 api: self._api.clone(),
353 endpoint: endpoint.clone(),
354 }
355 }
356 }
357 }
358
359 pub fn get_merge_fields(
363 &self,
364 filter: Option<ListMergeFieldFilter>,
365 ) -> MalchimpIter<ListMergeFieldBuilder> {
366 let endpoint = self.get_base_endpoint() + "/merge-fields";
368 let mut filter_params = ListMergeFieldFilter::default();
369
370 if let Some(f) = filter {
371 filter_params = f;
372 }
373
374 match self
375 ._api
376 .get::<CollectionListMergeField>(&endpoint, filter_params.build_payload())
377 {
378 Ok(collection) => MalchimpIter {
379 builder: ListMergeFieldBuilder {
380 endpoint: endpoint.clone(),
381 },
382 data: collection.merge_fields,
383 cur_filters: filter_params.clone(),
384 cur_it: 0,
385 total_items: collection.total_items,
386 api: self._api.clone(),
387 endpoint: endpoint.clone(),
388 },
389 Err(e) => {
390 error!( target: "mailchimp", "Get Activities: Response Error details: {:?}", e);
391 MalchimpIter {
392 builder: ListMergeFieldBuilder {
393 endpoint: endpoint.clone(),
394 },
395 data: Vec::new(),
396 cur_filters: filter_params.clone(),
397 cur_it: 0,
398 total_items: 0,
399 api: self._api.clone(),
400 endpoint: endpoint.clone(),
401 }
402 }
403 }
404 }
405
406 pub fn get_specific_merge_field<'a>(
410 &self,
411 merge_id: &'a str,
412 ) -> MailchimpResult<ListMergeField> {
413 let endpoint = self.get_base_endpoint() + "/merge-fields/";
415
416 match self
417 ._api
418 .get::<ListMergeField>(&(endpoint.clone() + merge_id), HashMap::new())
419 {
420 Ok(data) => {
421 let mut n_data = data.clone();
422 n_data.set_api(self._api.clone());
423 n_data.set_endpoint(&endpoint.clone());
424 Ok(data)
425 }
426 Err(e) => Err(e),
427 }
428 }
429
430 pub fn create_merge_field(
434 &self,
435 param: ListMergeFieldParam,
436 ) -> MailchimpResult<ListMergeField> {
437 let endpoint = self.get_base_endpoint() + "/merge-fields";
439 match self
440 ._api
441 .post::<ListMergeField, ListMergeFieldParam>(&endpoint, param)
442 {
443 Ok(data) => {
444 let mut n_data = data.clone();
445 n_data.set_api(self._api.clone());
446 n_data.set_endpoint(&endpoint);
447 Ok(n_data)
448 }
449 Err(e) => Err(e),
450 }
451 }
452 pub fn get_webhooks(&self, filter: Option<SimpleFilter>) -> MalchimpIter<ListWebhooksBuilder> {
456 let endpoint = self.get_base_endpoint() + "/webhooks";
458 let mut filter_params = SimpleFilter::default();
459 println!("{}", &endpoint);
460
461 if let Some(f) = filter {
462 filter_params = f;
463 }
464
465 match self
466 ._api
467 .get::<CollectionListWebhooks>(&endpoint, filter_params.build_payload())
468 {
469 Ok(collection) => MalchimpIter {
470 builder: ListWebhooksBuilder {
471 endpoint: endpoint.clone(),
472 },
473 data: collection.webhooks,
474 cur_filters: filter_params.clone(),
475 cur_it: 0,
476 total_items: collection.total_items,
477 api: self._api.clone(),
478 endpoint: endpoint.clone(),
479 },
480 Err(e) => {
481 error!( target: "mailchimp", "Get Activities: Response Error details: {:?}", e);
482 MalchimpIter {
483 builder: ListWebhooksBuilder {
484 endpoint: endpoint.clone(),
485 },
486 data: Vec::new(),
487 cur_filters: filter_params.clone(),
488 cur_it: 0,
489 total_items: 0,
490 api: self._api.clone(),
491 endpoint: endpoint.clone(),
492 }
493 }
494 }
495 }
496
497 pub fn get_specific_webhook<'a>(&self, webkook_id: &'a str) -> MailchimpResult<ListWebhooks> {
501 let endpoint = self.get_base_endpoint() + "/webhooks/";
503
504 match self
505 ._api
506 .get::<ListWebhooks>(&(endpoint.clone() + webkook_id), HashMap::new())
507 {
508 Ok(data) => {
509 let mut n_data = data.clone();
510 n_data.set_api(self._api.clone());
511 n_data.set_endpoint(&endpoint.clone());
512 Ok(data)
513 }
514 Err(e) => Err(e),
515 }
516 }
517
518 pub fn create_webhook(&self, param: ListWebhooksParam) -> MailchimpResult<ListWebhooks> {
522 let endpoint = self.get_base_endpoint() + "/webhooks";
524 match self
525 ._api
526 .post::<ListWebhooks, ListWebhooksParam>(&endpoint, param)
527 {
528 Ok(data) => {
529 let mut n_data = data.clone();
530 n_data.set_api(self._api.clone());
531 n_data.set_endpoint(&endpoint);
532 Ok(n_data)
533 }
534 Err(e) => Err(e),
535 }
536 }
537 pub fn get_clients(
547 &self,
548 fields: Option<String>,
549 exclude_fields: Option<String>,
550 ) -> MalchimpIter<ListClientsBuilder> {
551 let endpoint = self.get_base_endpoint() + "/clients";
553 let mut filter_params = SimpleFilter::default();
554
555 if let Some(f) = fields {
556 filter_params.fields = Some(f);
557 }
558
559 if let Some(ex) = exclude_fields {
560 filter_params.exclude_fields = Some(ex);
561 }
562
563 match self
564 ._api
565 .get::<CollectionListClients>(&endpoint, filter_params.build_payload())
566 {
567 Ok(collection) => MalchimpIter {
568 builder: ListClientsBuilder {},
569 data: collection.clients,
570 cur_filters: filter_params.clone(),
571 cur_it: 0,
572 total_items: collection.total_items,
573 api: self._api.clone(),
574 endpoint: endpoint.clone(),
575 },
576 Err(e) => {
577 error!( target: "mailchimp", "Get Clients: Response Error details: {:?}", e);
578 MalchimpIter {
579 builder: ListClientsBuilder {},
580 data: Vec::new(),
581 cur_filters: filter_params.clone(),
582 cur_it: 0,
583 total_items: 0,
584 api: self._api.clone(),
585 endpoint: endpoint.clone(),
586 }
587 }
588 }
589 }
590
591 pub fn get_locations(
602 &self,
603 fields: Option<String>,
604 exclude_fields: Option<String>,
605 ) -> MalchimpIter<ListLocationsBuilder> {
606 let endpoint = self.get_base_endpoint() + "/locations";
608 let mut filter_params = SimpleFilter::default();
609
610 if let Some(f) = fields {
611 filter_params.fields = Some(f);
612 }
613
614 if let Some(ex) = exclude_fields {
615 filter_params.exclude_fields = Some(ex);
616 }
617
618 match self
619 ._api
620 .get::<CollectionListLocations>(&endpoint, filter_params.build_payload())
621 {
622 Ok(collection) => MalchimpIter {
623 builder: ListLocationsBuilder {},
624 data: collection.locations,
625 cur_filters: filter_params.clone(),
626 cur_it: 0,
627 total_items: collection.total_items,
628 api: self._api.clone(),
629 endpoint: endpoint.clone(),
630 },
631 Err(e) => {
632 error!( target: "mailchimp", "Get Locations: Response Error details: {:?}", e);
633 MalchimpIter {
634 builder: ListLocationsBuilder {},
635 data: Vec::new(),
636 cur_filters: filter_params.clone(),
637 cur_it: 0,
638 total_items: 0,
639 api: self._api.clone(),
640 endpoint: endpoint.clone(),
641 }
642 }
643 }
644 }
645
646 pub fn get_abuse_reports(
659 &self,
660 fields: Option<String>,
661 exclude_fields: Option<String>,
662 offset: Option<u64>,
663 ) -> MalchimpIter<ListAbuseReportBuilder> {
664 let endpoint = self.get_base_endpoint() + "/abuse-reports";
666 let mut filter_params = SimpleFilter::default();
667
668 if let Some(f) = fields {
669 filter_params.fields = Some(f);
670 }
671
672 if let Some(ex) = exclude_fields {
673 filter_params.exclude_fields = Some(ex);
674 }
675 if let Some(ofs) = offset {
676 filter_params.offset = Some(ofs);
677 }
678
679 match self
680 ._api
681 .get::<CollectionListAbuseReport>(&endpoint, filter_params.build_payload())
682 {
683 Ok(collection) => MalchimpIter {
684 builder: ListAbuseReportBuilder {},
685 data: collection.abuse_reports,
686 cur_filters: filter_params.clone(),
687 cur_it: 0,
688 total_items: collection.total_items,
689 api: self._api.clone(),
690 endpoint: endpoint.clone(),
691 },
692 Err(e) => {
693 error!( target: "mailchimp", "Get Abuse Reports: Response Error details: {:?}", e);
694 MalchimpIter {
695 builder: ListAbuseReportBuilder {},
696 data: Vec::new(),
697 cur_filters: filter_params.clone(),
698 cur_it: 0,
699 total_items: 0,
700 api: self._api.clone(),
701 endpoint: endpoint.clone(),
702 }
703 }
704 }
705 }
706
707 pub fn get_specific_abuse_report<'a>(
714 &self,
715 report_id: &'a str,
716 ) -> MailchimpResult<ListAbuseReportType> {
717 let mut endpoint = self.get_base_endpoint() + "/abuse-reports/";
719 endpoint.push_str(report_id);
720
721 self._api
722 .get::<ListAbuseReportType>(&endpoint, HashMap::new())
723 }
724
725 pub fn get_growth_history(
736 &self,
737 fields: Option<String>,
738 exclude_fields: Option<String>,
739 sort_dir: Option<String>,
740 ) -> MalchimpIter<ListGrowthHistoryBuilder> {
741 let endpoint = self.get_base_endpoint() + "/growth-history";
743 let mut filter_params = ListGrowthHistoryFilter::default();
744
745 if let Some(f) = fields {
746 filter_params.fields = Some(f);
747 }
748
749 if let Some(ex) = exclude_fields {
750 filter_params.exclude_fields = Some(ex);
751 }
752 if let Some(ofs) = sort_dir {
753 filter_params.sort_dir = Some(ofs);
754 }
755
756 match self
757 ._api
758 .get::<CollectionListGrowthHistory>(&endpoint, filter_params.build_payload())
759 {
760 Ok(collection) => MalchimpIter {
761 builder: ListGrowthHistoryBuilder {},
762 data: collection.history,
763 cur_filters: filter_params.clone(),
764 cur_it: 0,
765 total_items: collection.total_items,
766 api: self._api.clone(),
767 endpoint: endpoint.clone(),
768 },
769 Err(e) => {
770 error!( target: "mailchimp", "Get Grow History: Response Error details: {:?}", e);
771 MalchimpIter {
772 builder: ListGrowthHistoryBuilder {},
773 data: Vec::new(),
774 cur_filters: filter_params.clone(),
775 cur_it: 0,
776 total_items: 0,
777 api: self._api.clone(),
778 endpoint: endpoint.clone(),
779 }
780 }
781 }
782 }
783
784 pub fn get_growth_history_info<'a>(
791 &self,
792 month: &'a str,
793 ) -> MailchimpResult<ListGrowthHistoryType> {
794 let mut endpoint = self.get_base_endpoint() + "/growth-history/";
796 endpoint.push_str(month);
797
798 self._api
799 .get::<ListGrowthHistoryType>(&endpoint, HashMap::new())
800 }
801
802 pub fn get_members(
809 &self,
810 filter: Option<ListMembersFilter>,
811 ) -> MalchimpIter<ListMembersBuilder> {
812 let endpoint = self.get_base_endpoint() + "/members";
814 let filter_params = if let Some(f) = filter {
815 f
816 } else {
817 ListMembersFilter::default()
818 };
819
820 match self
821 ._api
822 .get::<CollectionListMembers>(&endpoint, filter_params.build_payload())
823 {
824 Ok(collection) => MalchimpIter {
825 builder: ListMembersBuilder {
826 endpoint: endpoint.clone(),
827 },
828 data: collection.members,
829 cur_filters: filter_params.clone(),
830 cur_it: 0,
831 total_items: collection.total_items,
832 api: self._api.clone(),
833 endpoint: endpoint.clone(),
834 },
835 Err(e) => {
836 error!( target: "mailchimp", "Get List Members: Response Error details: {:?}", e);
837 MalchimpIter {
838 builder: ListMembersBuilder {
839 endpoint: endpoint.clone(),
840 },
841 data: Vec::new(),
842 cur_filters: filter_params.clone(),
843 cur_it: 0,
844 total_items: 0,
845 api: self._api.clone(),
846 endpoint: endpoint.clone(),
847 }
848 }
849 }
850 }
851
852 pub fn get_member_info<'a>(&self, subscriber_hash: &'a str) -> MailchimpResult<ListMember> {
860 let mut endpoint = self.get_base_endpoint() + "/members/";
862 endpoint.push_str(subscriber_hash);
863
864 self._api.get::<ListMember>(&endpoint, HashMap::new())
865 }
866
867 pub fn add_new_member(&self, param: ListMemberParams) -> MailchimpResult<ListMember> {
874 let endpoint = self.get_base_endpoint() + "/members";
876 self._api
877 .post::<ListMember, ListMemberParams>(&endpoint, param)
878 }
879
880 pub fn add_update_member<'a>(
888 &self,
889 subscriber_hash: &'a str,
890 param: ListMemberParams,
891 ) -> MailchimpResult<ListMember> {
892 let mut endpoint = self.get_base_endpoint() + "/members/";
894 endpoint.push_str(subscriber_hash);
895
896 self._api
897 .put::<ListMember, ListMemberParams>(&endpoint, param)
898 }
899
900 pub fn get_interest_categories(
907 &self,
908 filters: Option<ListInterestCategoryFilter>,
909 ) -> MalchimpIter<ListInterestCategoryBuilder> {
910 let mut endpoint = self.get_base_endpoint();
912 endpoint.push_str("/interest-categories");
913
914 let filter_params = if let Some(f) = filters {
915 f
916 } else {
917 ListInterestCategoryFilter::default()
918 };
919
920 match self
921 ._api
922 .get::<CollectionListInterestCategories>(&endpoint, filter_params.build_payload())
923 {
924 Ok(collection) => MalchimpIter {
925 builder: ListInterestCategoryBuilder {
926 endpoint: endpoint.clone(),
927 },
928 data: collection.categories,
929 cur_filters: filter_params.clone(),
930 cur_it: 0,
931 total_items: collection.total_items,
932 api: self._api.clone(),
933 endpoint: endpoint.clone(),
934 },
935 Err(e) => {
936 error!( target: "mailchimp", "Get List Members: Response Error details: {:?}", e);
937 MalchimpIter {
938 builder: ListInterestCategoryBuilder {
939 endpoint: endpoint.clone(),
940 },
941 data: Vec::new(),
942 cur_filters: filter_params.clone(),
943 cur_it: 0,
944 total_items: 0,
945 api: self._api.clone(),
946 endpoint: endpoint.clone(),
947 }
948 }
949 }
950 }
951
952 pub fn get_specific_note<'a>(
959 &self,
960 interest_category_id: &'a str,
961 ) -> MailchimpResult<ListInterestCategory> {
962 let mut endpoint = self.get_base_endpoint();
964 endpoint.push_str("/interest-categories/");
965 endpoint.push_str(interest_category_id);
966
967 self._api
968 .get::<ListInterestCategory>(&endpoint, HashMap::new())
969 }
970
971 pub fn create_interest_category<'a>(
978 &self,
979 param: InterestCategoryParam,
980 ) -> MailchimpResult<ListInterestCategory> {
981 let mut endpoint = self.get_base_endpoint();
983 endpoint.push_str("/interest-categories");
984
985 self._api
986 .post::<ListInterestCategory, InterestCategoryParam>(&endpoint, param)
987 }
988 pub fn create_signup_form<'a>(&self, form: ListSignupForm) -> MailchimpResult<ListSignupForm> {
995 let mut endpoint = self.get_base_endpoint();
997 endpoint.push_str("/signup-forms");
998 self._api
999 .post::<ListSignupForm, ListSignupForm>(&endpoint, form)
1000 }
1001
1002 pub fn get_signup_forms(
1009 &self,
1010 filters: Option<SimpleFilter>,
1011 ) -> MalchimpIter<ListSignupFormBuilder> {
1012 let mut endpoint = self.get_base_endpoint();
1014 endpoint.push_str("/signup-forms");
1015
1016 let filter_params = if let Some(f) = filters {
1017 f
1018 } else {
1019 SimpleFilter::default()
1020 };
1021
1022 match self
1023 ._api
1024 .get::<CollectionListSignupForm>(&endpoint, filter_params.build_payload())
1025 {
1026 Ok(collection) => MalchimpIter {
1027 builder: ListSignupFormBuilder {},
1028 data: collection.signup_forms,
1029 cur_filters: filter_params.clone(),
1030 cur_it: 0,
1031 total_items: collection.total_items,
1032 api: self._api.clone(),
1033 endpoint: endpoint.clone(),
1034 },
1035 Err(e) => {
1036 error!( target: "mailchimp", "Get List Members: Response Error details: {:?}", e);
1037 MalchimpIter {
1038 builder: ListSignupFormBuilder {},
1039 data: Vec::new(),
1040 cur_filters: filter_params.clone(),
1041 cur_it: 0,
1042 total_items: 0,
1043 api: self._api.clone(),
1044 endpoint: endpoint.clone(),
1045 }
1046 }
1047 }
1048 }
1049
1050 pub fn get_segments(
1054 &self,
1055 filters: Option<ListSegmentFilter>,
1056 ) -> MalchimpIter<ListSegmentBuilder> {
1057 let mut endpoint = self.get_base_endpoint();
1059 endpoint.push_str("/segments");
1060
1061 let filter_params = if let Some(f) = filters {
1062 f
1063 } else {
1064 ListSegmentFilter::default()
1065 };
1066
1067 match self
1068 ._api
1069 .get::<CollectionListSegment>(&endpoint, filter_params.build_payload())
1070 {
1071 Ok(collection) => MalchimpIter {
1072 builder: ListSegmentBuilder {
1073 endpoint: endpoint.clone(),
1074 },
1075 data: collection.segments,
1076 cur_filters: filter_params.clone(),
1077 cur_it: 0,
1078 total_items: collection.total_items,
1079 api: self._api.clone(),
1080 endpoint: endpoint.clone(),
1081 },
1082 Err(e) => {
1083 error!( target: "mailchimp", "Get List Segments: Response Error details: {:?}", e);
1084 MalchimpIter {
1085 builder: ListSegmentBuilder {
1086 endpoint: endpoint.clone(),
1087 },
1088 data: Vec::new(),
1089 cur_filters: filter_params.clone(),
1090 cur_it: 0,
1091 total_items: 0,
1092 api: self._api.clone(),
1093 endpoint: endpoint.clone(),
1094 }
1095 }
1096 }
1097 }
1098
1099 pub fn get_specific_segment<'a>(&self, segment_id: &'a str) -> MailchimpResult<ListSegment> {
1103 let mut endpoint = self.get_base_endpoint();
1105 endpoint.push_str("/segments/");
1106
1107 match self
1108 ._api
1109 .get::<ListSegment>(&(endpoint.clone() + segment_id), HashMap::new())
1110 {
1111 Ok(data) => {
1112 let mut n_data = data;
1113 n_data.set_api(self._api.clone());
1114 n_data.set_endpoint(&endpoint.clone());
1115 Ok(n_data)
1116 }
1117 Err(e) => Err(e),
1118 }
1119 }
1120
1121 pub fn delete(&self) -> Option<MailchimpErrorType> {
1128 let endpoint = self.get_base_endpoint();
1130 match self
1131 ._api
1132 .post::<EmptyType, HashMap<String, String>>(endpoint.as_str(), HashMap::new())
1133 {
1134 Ok(_) => None,
1135 Err(e) => Some(e),
1136 }
1137 }
1138
1139 pub fn update(&self, param: ListParam) -> MailchimpResult<ListType> {
1143 self._api
1145 .patch::<ListType, ListParam>(self.get_base_endpoint().as_str(), param)
1146 }
1147
1148 fn get_base_endpoint(&self) -> String {
1152 String::from("lists/") + self.id.as_ref().unwrap().as_str()
1153 }
1154}
1155
1156#[derive(Serialize, Deserialize, Debug, Clone)]
1160pub struct ListParam {
1161 #[serde(default, skip_serializing_if = "Option::is_none")]
1163 pub name: Option<String>,
1164 #[serde(default, skip_serializing_if = "Option::is_none")]
1166 pub contact: Option<ContactType>,
1167 #[serde(default, skip_serializing_if = "Option::is_none")]
1169 pub permission_reminder: Option<String>,
1170 #[serde(default, skip_serializing_if = "Option::is_none")]
1172 pub use_archive_bar: Option<bool>,
1173 #[serde(default, skip_serializing_if = "Option::is_none")]
1175 pub campaign_defaults: Option<CampaignDefaultsType>,
1176 #[serde(default, skip_serializing_if = "Option::is_none")]
1178 pub notify_on_subscribe: Option<String>,
1179 #[serde(default, skip_serializing_if = "Option::is_none")]
1181 pub notify_on_unsubscribe: Option<String>,
1182 #[serde(default, skip_serializing_if = "Option::is_none")]
1187 pub email_type_option: Option<bool>,
1188 #[serde(default, skip_serializing_if = "Option::is_none")]
1190 pub visibility: Option<String>,
1191 #[serde(default, skip_serializing_if = "Option::is_none")]
1193 pub double_optin: Option<bool>,
1194 #[serde(default, skip_serializing_if = "Option::is_none")]
1196 pub marketing_permissions: Option<bool>,
1197}