tin_actix_api_resp/
responder.rs

1use 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    /// Status code
9    code: u32,
10    /// Message describing the response
11    message: &'a str,
12    /// Optional data included in the response
13    #[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    /// Status code
33    code: u32,
34    /// Error message
35    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}