use reqwest::header::{HeaderMap, HeaderValue, CONTENT_TYPE};
use reqwest::Url;
use serde::de::DeserializeOwned;
use serde::ser::Serialize;
use serde_json;
use std::collections::HashMap;
use super::error_type::MailchimpErrorType;
use super::request::{BasicAuth, HttpReq, MailchimpResult};
#[derive(Debug, Clone)]
pub struct Api<R>
where
R: HttpReq,
{
domain: String,
api_version: String,
api_key: String,
req: Box<R>,
basic_auth: Option<BasicAuth>,
}
impl<R> Api<R>
where
R: HttpReq,
{
pub fn new<'a>(dc: &'a str, api_key: &'a str, http_transport: Box<R>) -> Self {
Api {
domain: format!("https://{}.api.mailchimp.com/", dc),
api_version: "3.0".to_string(),
api_key: api_key.to_string(),
req: http_transport,
basic_auth: Some(BasicAuth {
username: "".to_string(),
api_token: api_key.to_string(),
}),
}
}
pub fn domain(&self) -> String {
self.domain.clone()
}
pub fn api_version(&self) -> String {
self.api_version.clone()
}
pub fn build_url<'a>(&self, endpoint: &'a str, params: &HashMap<String, String>) -> Url {
let mut api_url = Url::parse(&self.domain).unwrap();
let data = self.api_version.clone() + "/";
api_url = api_url.join(data.as_str()).unwrap();
api_url = api_url.join(endpoint).unwrap();
for (key, value) in params {
api_url
.query_pairs_mut()
.append_pair(key.as_str(), value.as_str());
}
api_url
}
pub fn build_headers(&self) -> HeaderMap {
let mut headers = HeaderMap::new();
headers.insert(
CONTENT_TYPE,
HeaderValue::from_str("application/json").unwrap(),
);
headers
}
pub fn get_edge<'a, T>(
&self,
endpoint: &'a str,
params: HashMap<String, String>,
) -> MailchimpResult<T>
where
T: DeserializeOwned,
{
let api_url = self.build_url(endpoint, ¶ms);
let headers = self.build_headers();
let mut result = self.req.get(api_url, headers, &self.basic_auth)?;
if result.len() == 0 {
result = "{}".to_string();
}
match serde_json::from_str(&result) {
Ok(sr) => Ok(sr),
Err(e) => {
println!("{:?}", e);
Err(MailchimpErrorType::default())
}
}
}
pub fn delete_edge<'a, T>(
&self,
endpoint: &'a str,
params: HashMap<String, String>,
) -> MailchimpResult<T>
where
T: DeserializeOwned,
{
let api_url = self.build_url(endpoint, ¶ms);
let headers = self.build_headers();
let mut result = self.req.delete(api_url, headers, &self.basic_auth)?;
if result.len() == 0 {
result = "{}".to_string();
}
match serde_json::from_str(&result) {
Ok(sr) => Ok(sr),
Err(e) => {
println!("{:?}", e);
Err(MailchimpErrorType::default())
}
}
}
pub fn post_edge<'a, T, P>(&self, endpoint: &'a str, payload: P) -> MailchimpResult<T>
where
T: DeserializeOwned,
P: Serialize,
{
let api_url = self.build_url(endpoint, &HashMap::new());
let headers = self.build_headers();
let mut result = self
.req
.post::<P>(api_url, headers, payload, &self.basic_auth)?;
if result.len() == 0 {
result = "{}".to_string();
}
match serde_json::from_str(&result) {
Ok(sr) => Ok(sr),
Err(e) => {
println!("Post Edge {:?}", e);
Err(MailchimpErrorType::default())
}
}
}
pub fn patch_edge<'a, T, P>(&self, endpoint: &'a str, payload: P) -> MailchimpResult<T>
where
T: DeserializeOwned,
P: Serialize,
{
let api_url = self.build_url(endpoint, &HashMap::new());
let headers = self.build_headers();
let mut result = self
.req
.patch::<P>(api_url, headers, payload, &self.basic_auth)?;
if result.len() == 0 {
result = "{}".to_string();
}
match serde_json::from_str(&result) {
Ok(sr) => Ok(sr),
Err(e) => {
println!("Post Edge {:?}", e);
Err(MailchimpErrorType::default())
}
}
}
pub fn put_edge<'a, T, P>(&self, endpoint: &'a str, payload: P) -> MailchimpResult<T>
where
T: DeserializeOwned,
P: Serialize,
{
let api_url = self.build_url(endpoint, &HashMap::new());
let headers = self.build_headers();
let mut result = self
.req
.put::<P>(api_url, headers, payload, &self.basic_auth)?;
if result.len() == 0 {
result = "{}".to_string();
}
match serde_json::from_str(&result) {
Ok(sr) => Ok(sr),
Err(e) => {
println!("Post Edge {:?}", e);
Err(MailchimpErrorType::default())
}
}
}
}