use axum::{
response::{IntoResponse, Response},
Json,
};
use reqwest::StatusCode;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)]
pub enum Status {
#[serde(rename = "success")]
Success,
#[serde(rename = "error")]
Error,
}
#[derive(Debug, Serialize)]
pub struct ErrorResponse {
pub status: Status,
pub message: String,
}
#[derive(Debug)]
pub struct ApiError(pub StatusCode, pub anyhow::Error);
impl IntoResponse for ApiError {
fn into_response(self) -> Response {
(
self.0,
Json(ErrorResponse {
status: Status::Error,
message: self.1.to_string(),
}),
)
.into_response()
}
}
impl<E> From<E> for ApiError
where
E: Into<anyhow::Error>,
{
fn from(err: E) -> Self {
ApiError(StatusCode::INTERNAL_SERVER_ERROR, err.into())
}
}
pub type Result<T> = std::result::Result<T, ApiError>;