use super::automation_campaign::{
CampaignReportSummaryType, CampaignSettingsType, CampaignTrackingOptionsType, RecipientType,
SocialCardType,
};
use super::campaign_content::{CampaignContentParam, CampaignContentType};
use super::campaign_feedback::{
CampaignFeedbackBuilder, CampaignFeedbackType, CollectionCampaignFeedback,
};
use super::campaign_send_checklist::SendChecklistType;
use super::empty::EmptyType;
use super::link::LinkType;
use crate::api::{MailchimpApi, MailchimpApiUpdate};
use crate::internal::request::MailchimpResult;
use crate::iter::MailchimpCollection;
use crate::iter::{MalchimpIter, ResourceFilter, SimpleFilter};
use std::collections::HashMap;
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct CampaignDeliveryStatusType {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enabled: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub can_cancel: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub emails_sent: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub emails_canceled: Option<u64>,
}
impl Default for CampaignDeliveryStatusType {
fn default() -> Self {
CampaignDeliveryStatusType {
enabled: None,
can_cancel: None,
status: None,
emails_sent: None,
emails_canceled: None,
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ABTestingOptionsType {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub split_test: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub pick_winner: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub wait_units: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub wait_time: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub split_size: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub from_name_a: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub from_name_b: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reply_email_a: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reply_email_b: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub subject_a: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub subject_b: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub send_time_a: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub send_time_b: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub send_time_winner: Option<String>,
}
impl Default for ABTestingOptionsType {
fn default() -> Self {
ABTestingOptionsType {
split_test: None,
pick_winner: None,
wait_units: None,
wait_time: None,
split_size: None,
from_name_a: None,
from_name_b: None,
reply_email_a: None,
reply_email_b: None,
subject_a: None,
subject_b: None,
send_time_a: None,
send_time_b: None,
send_time_winner: None,
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct DailySendingDaysType {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sunday: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub monday: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tuesday: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub wednesday: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub thursday: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub friday: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub saturday: Option<bool>,
}
impl Default for DailySendingDaysType {
fn default() -> Self {
DailySendingDaysType {
sunday: None,
monday: None,
tuesday: None,
wednesday: None,
thursday: None,
friday: None,
saturday: None,
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct SendingScheduleType {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub hour: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub daily_send: Option<DailySendingDaysType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub weekly_send_day: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub monthly_send_date: Option<f32>,
}
impl Default for SendingScheduleType {
fn default() -> Self {
SendingScheduleType {
hour: None,
daily_send: None,
weekly_send_day: None,
monthly_send_date: None,
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct RSSOptionsType {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub feed_url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub frequency: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub schedule: Option<SendingScheduleType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_sent: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub constrain_rss_img: Option<bool>,
}
impl Default for RSSOptionsType {
fn default() -> Self {
RSSOptionsType {
feed_url: None,
frequency: None,
schedule: None,
last_sent: None,
constrain_rss_img: None,
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct CombinationsType {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub subject_line: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub send_time: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub from_name: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reply_to: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub content_description: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub recipients: Option<u64>,
}
impl Default for CombinationsType {
fn default() -> Self {
CombinationsType {
id: None,
subject_line: None,
send_time: None,
from_name: None,
reply_to: None,
content_description: None,
recipients: None,
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct VariateSettingsType {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub winning_combination_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub winning_campaign_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub winner_criteria: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub wait_time: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub test_size: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub subject_lines: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub send_times: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub from_names: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reply_to_addresses: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub contents: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub combinations: Option<Vec<CombinationsType>>,
}
impl Default for VariateSettingsType {
fn default() -> Self {
VariateSettingsType {
winning_combination_id: None,
winning_campaign_id: None,
winner_criteria: None,
wait_time: None,
test_size: None,
subject_lines: None,
send_times: None,
from_names: None,
reply_to_addresses: None,
contents: None,
combinations: None,
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct CampaignType {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub web_id: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub parent_campaign_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "type")]
pub campaign_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub create_time: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub archive_url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub long_archive_url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub emails_sent: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub send_time: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub content_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub needs_block_refresh: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub has_logo_merge_tag: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub resendable: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub recipients: Option<RecipientType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub settings: Option<CampaignSettingsType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub variate_settings: Option<VariateSettingsType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tracking: Option<CampaignTrackingOptionsType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rss_opts: Option<RSSOptionsType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ab_split_opts: Option<ABTestingOptionsType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub social_card: Option<SocialCardType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub report_summary: Option<CampaignReportSummaryType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub delivery_status: Option<CampaignDeliveryStatusType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub _links: Option<Vec<LinkType>>,
#[serde(skip)]
_api: MailchimpApi,
}
impl MailchimpApiUpdate for CampaignType {
fn set_api(&mut self, n_api: &MailchimpApi) {
self._api = n_api.clone()
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct CampaignsType {
#[serde(default)]
pub campaigns: Vec<CampaignType>,
#[serde(default)]
pub total_items: u64,
#[serde(default)]
pub _links: Vec<LinkType>,
}
impl MailchimpCollection<CampaignType> for CampaignsType {
fn get_total_items(&self) -> u64 {
self.total_items
}
fn get_values(&self) -> Vec<CampaignType> {
self.campaigns.clone()
}
}
impl Default for CampaignsType {
fn default() -> Self {
CampaignsType {
campaigns: Vec::new(),
total_items: 0,
_links: Vec::new(),
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ScheduleBatchDelivery {
#[serde(default)]
pub batch_delay: u64,
#[serde(default)]
pub batch_count: u64,
}
impl Default for ScheduleBatchDelivery {
fn default() -> Self {
ScheduleBatchDelivery {
batch_delay: 0,
batch_count: 0,
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ScheduleParam {
#[serde(default)]
pub schedule_time: String,
#[serde(default)]
pub timewarp: bool,
#[serde(default)]
pub batch_delivery: Option<ScheduleBatchDelivery>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct EmailParam {
#[serde(default)]
pub test_emails: Vec<String>,
#[serde(default)]
pub send_type: String,
}
impl EmailParam {
pub fn new(test_emails: Vec<String>, send_type: String) -> Self {
EmailParam {
test_emails: test_emails,
send_type: send_type,
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct UpdateCampaignParam {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub recipients: Option<RecipientType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub settings: Option<CampaignSettingsType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub variate_settings: Option<VariateSettingsType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tracking: Option<CampaignTrackingOptionsType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rss_opts: Option<RSSOptionsType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub social_card: Option<SocialCardType>,
}
impl CampaignType {
pub fn cancel_campaign(&self) -> MailchimpResult<EmptyType> {
let endpoint = self.get_base_endpoint() + "/actions/cancel-send";
self._api
.post::<EmptyType, HashMap<String, String>>(&endpoint, HashMap::new())
}
pub fn resend_campaign(&self) -> MailchimpResult<CampaignType> {
let endpoint = self.get_base_endpoint() + "/actions/create-resend";
self._api
.post::<CampaignType, HashMap<String, String>>(&endpoint, HashMap::new())
}
pub fn pause_rss_driven_campaign(&self) -> MailchimpResult<EmptyType> {
let endpoint = self.get_base_endpoint() + "/actions/pause";
self._api
.post::<EmptyType, HashMap<String, String>>(&endpoint, HashMap::new())
}
pub fn replicate_campaign(&self) -> MailchimpResult<CampaignType> {
let endpoint = self.get_base_endpoint() + "/actions/replicate";
self._api
.post::<CampaignType, HashMap<String, String>>(&endpoint, HashMap::new())
}
pub fn resume_rss_driven_campaign(&self) -> MailchimpResult<EmptyType> {
let endpoint = self.get_base_endpoint() + "/actions/resume";
self._api
.post::<EmptyType, HashMap<String, String>>(&endpoint, HashMap::new())
}
pub fn schedule_campaign(&self, param: ScheduleParam) -> MailchimpResult<EmptyType> {
let endpoint = self.get_base_endpoint() + "/actions/schedule";
self._api.post::<EmptyType, ScheduleParam>(&endpoint, param)
}
pub fn send_campaign(&self) -> MailchimpResult<EmptyType> {
let endpoint = self.get_base_endpoint() + "/actions/send";
self._api
.post::<EmptyType, HashMap<String, String>>(&endpoint, HashMap::new())
}
pub fn send_test_email(&self, param: EmailParam) -> MailchimpResult<EmptyType> {
let endpoint = self.get_base_endpoint() + "/actions/test";
self._api.post::<EmptyType, EmailParam>(&endpoint, param)
}
pub fn unschedule_campaign(&self) -> MailchimpResult<EmptyType> {
let endpoint = self.get_base_endpoint() + "/actions/unschedule";
self._api
.post::<EmptyType, HashMap<String, String>>(&endpoint, HashMap::new())
}
pub fn delete(&self) -> MailchimpResult<bool> {
let endpoint = self.get_base_endpoint();
match self._api.delete::<EmptyType>(&endpoint, HashMap::new()) {
Ok(_) => Ok(true),
Err(e) => Err(e),
}
}
pub fn update(&self, param: UpdateCampaignParam) -> MailchimpResult<CampaignType> {
let endpoint = self.get_base_endpoint();
self._api
.patch::<CampaignType, UpdateCampaignParam>(&endpoint, param)
}
pub fn get_content(
&self,
fields: Option<String>,
exclude_fields: Option<String>,
) -> MailchimpResult<CampaignContentType> {
let endpoint = self.get_base_endpoint() + "/content";
let mut payload = HashMap::new();
if let Some(field) = fields {
payload.insert("fields".to_string(), field);
}
if let Some(ef) = exclude_fields {
payload.insert("exclude_fields".to_string(), ef);
}
self._api
.get::<CampaignContentType>(endpoint.as_str(), payload)
}
pub fn update_content(
&self,
param: CampaignContentParam,
) -> MailchimpResult<CampaignContentType> {
let endpoint = self.get_base_endpoint() + "/content";
self._api
.put::<CampaignContentType, CampaignContentParam>(&endpoint, param)
}
pub fn send_checklist(
&self,
fields: Option<String>,
exclude_fields: Option<String>,
) -> MailchimpResult<SendChecklistType> {
let endpoint = self.get_base_endpoint() + "/send-checklist";
let mut payload = HashMap::new();
if let Some(field) = fields {
payload.insert("fields".to_string(), field);
}
if let Some(ef) = exclude_fields {
payload.insert("exclude_fields".to_string(), ef);
}
self._api
.get::<SendChecklistType>(endpoint.as_str(), payload)
}
pub fn get_feedbacks(
&self,
fields: Option<String>,
exclude_fields: Option<String>,
) -> MalchimpIter<CampaignFeedbackBuilder> {
let endpoint = self.get_base_endpoint() + "/feedback";
let mut filters = SimpleFilter::default();
if let Some(f) = fields {
filters.fields = Some(f.clone())
}
if let Some(ex) = exclude_fields {
filters.exclude_fields = Some(ex.clone())
}
let payload = filters.build_payload();
let response = self
._api
.get::<CollectionCampaignFeedback>(&endpoint, payload);
match response {
Ok(collection) => MalchimpIter {
builder: CampaignFeedbackBuilder {
endpoint: endpoint.clone(),
},
data: collection.feedback,
cur_filters: filters.clone(),
cur_it: 0,
total_items: collection.total_items,
api: self._api.clone(),
endpoint: endpoint.clone(),
},
Err(e) => {
println!("Feedback Iter {:?}", e);
MalchimpIter {
builder: CampaignFeedbackBuilder {
endpoint: endpoint.clone(),
},
data: Vec::new(),
cur_filters: filters.clone(),
cur_it: 0,
total_items: 0,
api: self._api.clone(),
endpoint: endpoint.clone(),
}
}
}
}
pub fn get_feedback_info<'a>(
&self,
feedback_id: &'a str,
fields: Option<String>,
exclude_fields: Option<String>,
) -> MailchimpResult<CampaignFeedbackType> {
let mut endpoint = self.get_base_endpoint() + "/feedback/";
endpoint = endpoint + feedback_id;
let mut payload = HashMap::new();
if let Some(f) = fields {
payload.insert("fields".to_string(), f.clone());
}
if let Some(ex) = exclude_fields {
payload.insert("exclude_fields".to_string(), ex.clone());
}
match self._api.get::<CampaignFeedbackType>(&endpoint, payload) {
Ok(feedback) => {
let mut n_f = feedback;
n_f.set_api(&self._api);
n_f.set_endpoint(&endpoint);
Ok(n_f)
}
Err(e) => Err(e),
}
}
fn get_base_endpoint(&self) -> String {
String::from("campaigns/") + &self.id.as_ref().unwrap()
}
}