1use super::error::ApiError;
2use reqwest::header::{HeaderMap, HeaderValue};
3use reqwest::{header, Client, ClientBuilder, Error, StatusCode};
4
5pub fn create_client(api_token: &str) -> Result<Client, Error> {
6 let mut headers = HeaderMap::new();
7
8 let mut auth_value = HeaderValue::from_str(&format!("Bearer {api_token}")).unwrap();
9 auth_value.set_sensitive(true);
11 headers.insert(header::AUTHORIZATION, auth_value);
12
13 Ok(ClientBuilder::new().default_headers(headers).build()?)
14}
15
16pub async fn translate_http_error(
17 response: reqwest::Response,
18) -> Result<reqwest::Response, ApiError> {
19 let status = response.status();
20 if !status.is_success() {
21 let body = response.text().await?;
25 let translated_error = match status {
26 StatusCode::TOO_MANY_REQUESTS => ApiError::TooManyRequests,
27 StatusCode::SERVICE_UNAVAILABLE => ApiError::Busy,
28 _ => ApiError::Http {
29 status: status.as_u16(),
30 body,
31 },
32 };
33 Err(translated_error)
34 } else {
35 Ok(response)
36 }
37}
38
39pub async fn get(
40 client: &reqwest::Client,
41 base_url: &str,
42 path: &str,
43 query: Option<Vec<(String, String)>>,
44) -> Result<reqwest::Response, ApiError> {
45 let url = format!("{base_url}{path}");
46 let mut request = client.get(url);
47 println!("{:?}", request);
48 if let Some(q) = query {
49 request = request.query(&q);
50 }
51 let response = request.send().await?;
52 println!("response: {:?}", response);
53 translate_http_error(response).await
54}
55
56pub async fn delete(
57 client: &reqwest::Client,
58 base_url: &str,
59 path: &str,
60) -> Result<reqwest::Response, ApiError> {
61 let url = format!("{base_url}{path}");
62 let response = client.delete(url).send().await?;
63 translate_http_error(response).await
64}