use log;
use reqwest;
use serde::de;
use std::env;
use super::request;
#[derive(Debug)]
pub struct Client {
client: reqwest::Client,
}
impl Client {
pub fn new(token: Option<&str>) -> Result<Self, Box<dyn std::error::Error>> {
let mut headers = reqwest::header::HeaderMap::new();
headers.insert(
reqwest::header::ACCEPT,
reqwest::header::HeaderValue::from_static("application/json"),
);
let bearer_token = match token {
Some(token) => format!("Bearer {token}"),
None => match env::var("RUDDR_TOKEN") {
Ok(token) => format!("Bearer {token}"),
Err(_) => {
return Err(Box::from(
"ruddr api token was not input through code or RUDDR_TOKEN environment variable",
));
}
},
};
let mut auth_token = reqwest::header::HeaderValue::from_str(&bearer_token)?;
auth_token.set_sensitive(true);
headers.insert(reqwest::header::AUTHORIZATION, auth_token);
log::debug!("built headers are {headers:?}");
let client = reqwest::Client::builder()
.default_headers(headers)
.build()?;
log::debug!("built client is {client:?}");
Ok(Self { client })
}
pub(crate) async fn read<Response: de::DeserializeOwned>(
&self,
endpoint: &str,
params: Option<&str>,
) -> Result<Response, Box<dyn std::error::Error>> {
let request = request::Request::new(endpoint, params)?;
log::debug!("request is {request:?}");
let response = request.get(&self.client).await?;
let deser = match response.error_for_status() {
Ok(response) => response.json::<Response>().await?,
Err(error) => {
log::error!("request failed with status {:?}", error.status().unwrap());
log::error!("{error}");
return Err(Box::from("client read response failed"));
}
};
log::debug!("successful read from Ruddr API");
Ok(deser)
}
}
#[cfg(test)]
mod tests;