use axum_core::response::{IntoResponse, Response};
use serde::Serialize;
#[derive(Debug, Serialize)]
pub struct ApiResponse<T: Serialize> {
status: u16,
message: String,
data: Option<T>,
}
impl<T: Serialize> ApiResponse<T> {
pub fn new(status: u16, message: String, data: T) -> Self {
ApiResponse {
status,
message,
data: Some(data),
}
}
pub fn get_status(&self) -> u16 {
self.status
}
pub fn get_message(&self) -> &str {
&self.message
}
pub fn get_data(&self) -> Option<&T> {
self.data.as_ref()
}
pub fn set_status(mut self, status_code: u16) -> ApiResponse<T> {
self.status = status_code;
return self;
}
pub fn set_message(mut self, message: impl Into<String>) -> ApiResponse<T> {
self.message = message.into();
return self;
}
pub fn set_data(mut self, data: T) -> ApiResponse<T> {
self.data = Some(data);
return self;
}
}
impl<T: Serialize> ApiResponse<T> {
pub fn ok(data: T) -> ApiResponse<T> {
return ApiResponse {
status: 0,
message: "ok".into(),
data: Some(data),
};
}
pub fn fail(data: T) -> ApiResponse<T> {
return ApiResponse {
status: 500,
message: "fail".into(),
data: Some(data),
};
}
pub fn empty() -> ApiResponse<T> {
return ApiResponse {
status: 204,
message: "".into(),
data: None,
};
}
}
impl<T> IntoResponse for ApiResponse<T>
where
T: Serialize,
{
fn into_response(self) -> Response {
Response::builder()
.header("Content-Type", "application/json")
.status(200)
.body(serde_json::json!(self).to_string().into())
.unwrap()
}
}