use std::collections::HashMap;
use std::str::FromStr;
use reqwest::header::{HeaderMap, HeaderName, HeaderValue};
use reqwest::{Client, Method};
use serde::de::DeserializeOwned;
use url::Url;
use crate::errors::response_error::RequestError;
use crate::utils::credentials_manager::CredentialsManager;
pub(crate) async fn fetch_endpoint<D: DeserializeOwned>(
credentials_manager: &CredentialsManager,
http_client: &Client,
uri: Url,
method: Method,
body: &str,
headers: &HashMap<String, String>,
) -> Result<D, RequestError> {
let auth_headers = credentials_manager.get_auth_headers().await?;
let headers: HeaderMap = headers
.iter()
.chain(auth_headers.iter())
.filter_map(|(key, value)| {
HeaderName::from_str(key.as_str())
.ok()
.and_then(|header_name| {
HeaderValue::from_str(value)
.map(|header_value| (header_name, header_value))
.ok()
})
})
.collect();
http_client
.request(method, uri)
.headers(headers)
.body(body.to_string())
.send()
.await
.map_err(RequestError::Fetch)?
.error_for_status()
.map_err(RequestError::Fetch)?
.json()
.await
.map_err(RequestError::Fetch)
}