tin_actix_api_resp/
responder.rs1use actix_web::{HttpResponse, Responder, ResponseError, body::BoxBody};
2use serde::Serialize;
3
4use crate::{ApiErr, macros::ApiRes};
5
6#[derive(Serialize)]
7struct ApiJsonBody<'a, T: Serialize> {
8 code: u32,
10 message: &'a str,
12 #[serde(skip_serializing_if = "Option::is_none")]
14 data: Option<&'a T>,
15}
16
17impl<T: Serialize> Responder for ApiRes<T> {
18 type Body = BoxBody;
19 fn respond_to(self, _req: &actix_web::HttpRequest) -> HttpResponse {
20 let status = self.status();
21 let body = ApiJsonBody {
22 code: self.code(),
23 message: self.message(),
24 data: self.data(),
25 };
26 HttpResponse::build(status).json(body)
27 }
28}
29
30#[derive(Serialize)]
31struct ApiJsonError<'a> {
32 code: u32,
34 message: &'a str,
36}
37
38impl ResponseError for ApiErr {
39 fn error_response(&self) -> HttpResponse {
40 let body = ApiJsonError {
41 code: self.code(),
42 message: self.message(),
43 };
44 HttpResponse::build(self.status()).json(body)
45 }
46}