use crate::{client, client::Client, endpoints::Endpoint};
#[derive(Debug, Clone)]
#[must_use]
pub struct Quick {
http_client: reqwest::Client,
access_token: String,
url: String,
}
impl Client<Quick> {
pub fn new(access_token: impl Into<String>) -> Self {
let http_client = reqwest::Client::default();
let inner_client = Quick {
http_client,
access_token: access_token.into(),
url: "https://api.monzo.com".into(),
};
Self { inner_client }
}
pub fn with_refresh_tokens(
self,
client_id: impl Into<String>,
client_secret: impl Into<String>,
refresh_token: impl Into<String>,
) -> Client<client::inner::Refreshable> {
Client::from_quick_client(self.inner_client, client_id, client_secret, refresh_token)
}
}
impl client::Inner for Quick {
async fn execute<E>(&self, endpoint: &E) -> reqwest::Result<reqwest::Response>
where
E: Endpoint,
{
let mut request = self
.http_client
.request(E::METHOD, self.url.clone() + endpoint.endpoint());
if E::AUTH_REQUIRED {
request = request.bearer_auth(&self.access_token);
}
if let Some(query) = endpoint.query() {
request = request.query(query);
}
if let Some(form) = endpoint.form() {
request = request.form(form);
}
if let Some(json) = endpoint.json() {
request = request.json(json);
}
request.send().await
}
fn access_token(&self) -> &String {
&self.access_token
}
fn set_access_token(&mut self, access_token: String) {
self.access_token = access_token;
}
fn url(&self) -> &str {
&self.url
}
}