AppFlowy-Cloud/admin_frontend/src/ext/mod.rs

50 lines
1.3 KiB
Rust

use shared_entity::response::{AppResponseError, ErrorCode};
use crate::ext::entities::JsonResponse;
pub mod api;
pub mod entities;
pub mod error;
async fn from_json_response<T>(resp: reqwest::Response) -> Result<T, error::Error>
where
T: serde::de::DeserializeOwned,
{
if !resp.status().is_success() {
let status = resp.status();
let payload = resp.text().await?;
return Err(error::Error::NotOk(status.as_u16(), payload));
}
let payload = resp.text().await?;
match serde_json::from_str::<JsonResponse<T>>(&payload) {
Ok(data) => Ok(data.data),
Err(_) => match serde_json::from_str::<AppResponseError>(&payload) {
Ok(af_cloud_err) => Err(error::Error::AppFlowyCloud(af_cloud_err)),
Err(err) => Err(error::Error::Unhandled(format!(
"Failed to parse JSON response: {:?}, Payload: {}",
err, payload
))),
},
}
}
async fn check_response(resp: reqwest::Response) -> Result<(), error::Error> {
let status = resp.status();
let payload = resp.text().await?;
if !status.is_success() {
return Err(error::Error::NotOk(status.as_u16(), payload));
}
if let Ok(cloud_err) = serde_json::from_str::<AppResponseError>(&payload) {
if cloud_err.code == ErrorCode::Ok {
return Ok(());
} else {
return Err(error::Error::AppFlowyCloud(cloud_err));
}
};
Ok(())
}