use axum::Json;
use axum::http::StatusCode;
use axum::response::{IntoResponse, Response};
use serde::{Serialize, Serializer};
#[derive(Debug, Serialize)]
pub struct ApiResponse {
pub status: u16,
pub message: String,
pub data: Data,
}
impl ApiResponse {
pub fn new(status: StatusCode, message: impl Into<String>, data: Data) -> Self {
Self {
status: status.as_u16(),
message: message.into(),
data,
}
}
}
impl IntoResponse for ApiResponse {
fn into_response(self) -> Response {
(status_code(self.status), Json(self)).into_response()
}
}
#[derive(Debug, Serialize)]
pub struct ErrorResponse {
pub status: u16,
pub message: String,
}
impl ErrorResponse {
pub fn new(status: StatusCode, message: impl Into<String>) -> Self {
Self {
status: status.as_u16(),
message: message.into(),
}
}
}
impl IntoResponse for ErrorResponse {
fn into_response(self) -> Response {
(status_code(self.status), Json(self)).into_response()
}
}
fn status_code(raw: u16) -> StatusCode {
StatusCode::from_u16(raw).unwrap_or(StatusCode::INTERNAL_SERVER_ERROR)
}
#[derive(Debug, Clone)]
pub enum Data {
None,
Some(serde_json::Value),
}
impl Serialize for Data {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match self {
Self::None => serializer.serialize_none(),
Self::Some(valor) => valor.serialize(serializer),
}
}
}