use super::api::{MailchimpApi, MailchimpApiUpdate};
use super::internal::request::MailchimpResult;
use super::iter::{BuildIter, MalchimpIter, ResourceFilter};
use super::types::{ListParam, ListType, ListsType};
use log::error;
use std::collections::HashMap;
use std::rc::Rc;
#[derive(Debug, Clone)]
pub struct ListFilter {
pub fields: Option<String>,
pub exclude_fields: Option<String>,
pub count: Option<u64>,
pub offset: Option<u64>,
pub campaign_type: Option<String>,
pub status: Option<String>,
pub before_send_time: Option<String>,
pub since_send_time: Option<String>,
pub before_create_time: Option<String>,
pub since_create_time: Option<String>,
pub email: Option<String>,
pub sort_field: Option<String>,
pub sort_dir: Option<String>,
}
impl Default for ListFilter {
fn default() -> Self {
ListFilter {
fields: None,
exclude_fields: None,
count: Some(50),
offset: Some(0),
campaign_type: None,
status: None,
before_send_time: None,
since_send_time: None,
before_create_time: None,
since_create_time: None,
email: None,
sort_field: None,
sort_dir: None,
}
}
}
impl ResourceFilter for ListFilter {
fn build_payload(&self) -> HashMap<String, String> {
let mut payload = HashMap::new();
if self.fields.is_some() {
payload.insert("fields".to_string(), self.fields.as_ref().unwrap().clone());
}
if self.exclude_fields.is_some() {
payload.insert(
"exclude_fields".to_string(),
self.exclude_fields.as_ref().unwrap().clone(),
);
}
if self.count.is_some() {
payload.insert(
"count".to_string(),
format!("{:}", self.count.as_ref().unwrap().clone()),
);
}
if self.offset.is_some() {
payload.insert(
"offset".to_string(),
format!("{:}", self.offset.as_ref().unwrap().clone()),
);
}
if self.campaign_type.is_some() {
payload.insert(
"campaign_type".to_string(),
self.campaign_type.as_ref().unwrap().clone(),
);
}
if self.status.is_some() {
payload.insert("status".to_string(), self.status.as_ref().unwrap().clone());
}
if self.before_send_time.is_some() {
payload.insert(
"before_send_time".to_string(),
self.before_send_time.as_ref().unwrap().clone(),
);
}
if self.since_send_time.is_some() {
payload.insert(
"since_send_time".to_string(),
self.since_send_time.as_ref().unwrap().clone(),
);
}
if self.before_create_time.is_some() {
payload.insert(
"before_create_time".to_string(),
self.before_create_time.as_ref().unwrap().clone(),
);
}
if self.since_create_time.is_some() {
payload.insert(
"since_create_time".to_string(),
self.since_create_time.as_ref().unwrap().clone(),
);
}
if self.email.is_some() {
payload.insert("email".to_string(), self.email.as_ref().unwrap().clone());
}
if self.sort_field.is_some() {
payload.insert(
"sort_field".to_string(),
self.sort_field.as_ref().unwrap().clone(),
);
}
if self.sort_field.is_some() {
payload.insert(
"sort_field".to_string(),
self.sort_field.as_ref().unwrap().clone(),
);
}
if self.sort_dir.is_some() {
payload.insert(
"sort_dir".to_string(),
self.sort_dir.as_ref().unwrap().clone(),
);
}
payload
}
}
#[derive(Debug, Clone)]
pub struct Lists {
api: Rc<MailchimpApi>,
}
#[derive(Debug)]
pub struct ListsBuilder {}
impl BuildIter for ListsBuilder {
type Item = ListType;
type FilterItem = ListFilter;
type Collection = ListsType;
fn update_item(&self, data: &Self::Item, api: Rc<MailchimpApi>) -> Self::Item {
let mut in_data = data.clone();
in_data.set_api(api);
in_data
}
fn update_filter_offset(&self, filter: &Self::FilterItem) -> Self::FilterItem {
let mut f = filter.clone();
f.offset = Some(f.count.unwrap() + f.offset.unwrap());
f
}
}
impl Lists {
pub fn new(api: MailchimpApi) -> Self {
Lists { api: Rc::new(api) }
}
pub fn create_list(&self, param: ListParam) -> MailchimpResult<ListType> {
self.api.post::<ListType, ListParam>("lists", param)
}
pub fn get_list_info<'a>(
&self,
list_id: &'a str,
filters: HashMap<String, String>,
) -> MailchimpResult<ListType> {
let endpoint = String::from("lists/") + list_id;
let response = self.api.get::<ListType>(endpoint.as_str(), filters);
match response {
Ok(data) => {
let mut d = data;
d.set_api(self.api.clone());
Ok(d)
}
Err(e) => Err(e),
}
}
pub fn get_campaigns_from_remote(&self, filters: Option<&ListFilter>) -> Option<ListsType> {
let mut payload = HashMap::new();
if filters.is_some() {
payload = filters.as_ref().unwrap().build_payload();
}
let response = self.api.get::<ListsType>("lists", payload);
match response {
Ok(value) => Some(value),
Err(e) => {
error!( target: "mailchimp", "Load Lists from remote: Response Error details: {:?}", e);
None
}
}
}
pub fn iter(&self, filters: ListFilter) -> MalchimpIter<ListsBuilder> {
if let Some(remote) = self.get_campaigns_from_remote(Some(&filters)) {
return MalchimpIter {
builder: ListsBuilder {},
data: remote.lists,
cur_filters: filters.clone(),
cur_it: 0,
total_items: remote.total_items,
api: self.api.clone(),
endpoint: "lists".to_string(),
};
}
MalchimpIter {
builder: ListsBuilder {},
data: Vec::new(),
cur_filters: filters.clone(),
cur_it: 0,
total_items: 0,
api: self.api.clone(),
endpoint: "lists".to_string(),
}
}
}