1use reqwest::header::{HeaderMap, HeaderValue, CONTENT_TYPE};
2use reqwest::Url;
3use serde::de::DeserializeOwned;
4use serde::ser::Serialize;
5use serde_json;
6use std::collections::HashMap;
7
8use super::error_type::MailchimpErrorType;
9use super::request::{BasicAuth, HttpReq, MailchimpResult};
10
11#[derive(Debug, Clone)]
15pub struct Api<R>
16where
17 R: HttpReq,
18{
19 domain: String,
20 api_version: String,
21 api_key: String,
22 req: Box<R>,
23 basic_auth: Option<BasicAuth>,
24}
25
26impl<R> Api<R>
27where
28 R: HttpReq,
29{
30 pub fn new<'a>(dc: &'a str, api_key: &'a str, http_transport: Box<R>) -> Self {
39 Api {
40 domain: format!("https://{}.api.mailchimp.com/", dc),
41 api_version: "3.0".to_string(),
42 api_key: api_key.to_string(),
43 req: http_transport,
44 basic_auth: Some(BasicAuth {
45 username: "".to_string(),
46 api_token: api_key.to_string(),
47 }),
48 }
49 }
50 pub fn domain(&self) -> String {
54 self.domain.clone()
55 }
56 pub fn api_version(&self) -> String {
60 self.api_version.clone()
61 }
62
63 pub fn build_url<'a>(&self, endpoint: &'a str, params: &HashMap<String, String>) -> Url {
71 let mut api_url = Url::parse(&self.domain).unwrap();
72 let data = self.api_version.clone() + "/";
73 api_url = api_url.join(data.as_str()).unwrap();
75 api_url = api_url.join(endpoint).unwrap();
77 for (key, value) in params {
78 api_url
79 .query_pairs_mut()
80 .append_pair(key.as_str(), value.as_str());
81 }
82 api_url
83 }
84
85 pub fn build_headers(&self) -> HeaderMap {
89 let mut headers = HeaderMap::new();
90 headers.insert(
91 CONTENT_TYPE,
92 HeaderValue::from_str("application/json").unwrap(),
93 );
94 headers
95 }
96
97 pub fn get_edge<'a, T>(
105 &self,
106 endpoint: &'a str,
107 params: HashMap<String, String>,
108 ) -> MailchimpResult<T>
109 where
110 T: DeserializeOwned,
111 {
112 let api_url = self.build_url(endpoint, ¶ms);
113 let headers = self.build_headers();
114 let mut result = self.req.get(api_url, headers, &self.basic_auth)?;
115 if result.len() == 0 {
116 result = "{}".to_string();
117 }
118 match serde_json::from_str(&result) {
119 Ok(sr) => Ok(sr),
120 Err(e) => {
121 println!("{:?}", e);
122 Err(MailchimpErrorType::default())
123 }
124 }
125 }
126 pub fn delete_edge<'a, T>(
134 &self,
135 endpoint: &'a str,
136 params: HashMap<String, String>,
137 ) -> MailchimpResult<T>
138 where
139 T: DeserializeOwned,
140 {
141 let api_url = self.build_url(endpoint, ¶ms);
142 let headers = self.build_headers();
143 let mut result = self.req.delete(api_url, headers, &self.basic_auth)?;
144 if result.len() == 0 {
145 result = "{}".to_string();
146 }
147 match serde_json::from_str(&result) {
148 Ok(sr) => Ok(sr),
149 Err(e) => {
150 println!("{:?}", e);
151 Err(MailchimpErrorType::default())
152 }
153 }
154 }
155
156 pub fn post_edge<'a, T, P>(&self, endpoint: &'a str, payload: P) -> MailchimpResult<T>
164 where
165 T: DeserializeOwned,
166 P: Serialize,
167 {
168 let api_url = self.build_url(endpoint, &HashMap::new());
169 let headers = self.build_headers();
170 let mut result = self
171 .req
172 .post::<P>(api_url, headers, payload, &self.basic_auth)?;
173 if result.len() == 0 {
174 result = "{}".to_string();
175 }
176 match serde_json::from_str(&result) {
177 Ok(sr) => Ok(sr),
178 Err(e) => {
179 println!("Post Edge {:?}", e);
180 Err(MailchimpErrorType::default())
181 }
182 }
183 }
184 pub fn patch_edge<'a, T, P>(&self, endpoint: &'a str, payload: P) -> MailchimpResult<T>
192 where
193 T: DeserializeOwned,
194 P: Serialize,
195 {
196 let api_url = self.build_url(endpoint, &HashMap::new());
197 let headers = self.build_headers();
198 let mut result = self
199 .req
200 .patch::<P>(api_url, headers, payload, &self.basic_auth)?;
201 if result.len() == 0 {
202 result = "{}".to_string();
203 }
204 match serde_json::from_str(&result) {
205 Ok(sr) => Ok(sr),
206 Err(e) => {
207 println!("Post Edge {:?}", e);
208 Err(MailchimpErrorType::default())
209 }
210 }
211 }
212 pub fn put_edge<'a, T, P>(&self, endpoint: &'a str, payload: P) -> MailchimpResult<T>
220 where
221 T: DeserializeOwned,
222 P: Serialize,
223 {
224 let api_url = self.build_url(endpoint, &HashMap::new());
225 let headers = self.build_headers();
226 let mut result = self
227 .req
228 .put::<P>(api_url, headers, payload, &self.basic_auth)?;
229 if result.len() == 0 {
230 result = "{}".to_string();
231 }
232 match serde_json::from_str(&result) {
233 Ok(sr) => Ok(sr),
234 Err(e) => {
235 println!("Post Edge {:?}", e);
236 Err(MailchimpErrorType::default())
237 }
238 }
239 }
240}