use std::time::Duration;
use reqwest::ClientBuilder;
use thiserror::Error;
use url::Url;
use super::api::{TokenRequest, TokenResponse};
#[allow(unused)]
pub struct ApiClient {
client: reqwest::Client,
api: Url,
}
impl ApiClient {
#[allow(unused)]
pub fn new(url: &Url) -> Result<Self, ClientError> {
let api = url.join("api/v1/")?;
let client = ClientBuilder::new()
.timeout(Duration::from_secs(5))
.build()?;
Ok(ApiClient { client, api })
}
#[allow(unused)]
pub async fn post_token(&self, req: TokenRequest) -> Result<TokenResponse, ClientError> {
let endpoint = self.api.join("token")?;
let response = self.client.post(endpoint).form(&req).send().await?;
if !response.status().is_success() {
return Err(ClientError::ReqwestError(
response.error_for_status().unwrap_err(),
));
}
let snap_token_resp = response
.json::<TokenResponse>()
.await
.expect("parse token exchange response");
Ok(snap_token_resp)
}
}
#[derive(Error, Debug)]
pub enum ClientError {
#[error("URL error: {0:?}")]
InvalidUrl(#[from] url::ParseError),
#[error("reqwest error: {0:?}")]
ReqwestError(#[from] reqwest::Error),
#[error("JSON error: {0:?}")]
SerdeJsonError(#[from] serde_json::Error),
}