1use reqwest::Response;
2use serde::{Deserialize, de::DeserializeOwned};
3use thiserror::Error;
4
5#[derive(Error, Debug)]
6pub enum ApiError {
7 #[error("Fail `{0:?}`")]
8 Fail(FailError),
9 #[error("Fail `{0}`")]
10 Reqwest(#[from] reqwest::Error),
11}
12
13#[derive(Debug, Deserialize)]
14struct FailResponse {
15 error: FailError,
16}
17
18#[derive(Debug, Deserialize)]
19pub struct FailError {
20 pub code: u16,
21 pub message: String,
22}
23
24pub(crate) async fn check_response<T: DeserializeOwned>(response: Response) -> Result<T, ApiError> {
25 if response.status() != 200 {
26 let error = response.json::<FailResponse>().await?;
27
28 Err(ApiError::Fail(error.error))
29 } else {
30 response.json().await.map_err(Into::into)
31 }
32}