actix_web_utils/extensions/
typed_response.rs1use actix_web::{HttpResponse, http::StatusCode, web, HttpRequest, HttpResponseBuilder, body::BoxBody, Responder};
2use serde::Serialize;
3
4use crate::dtos::message::MessageResource;
5
6 pub struct TypedHttpResponse<B: Serialize = String> {
23 pub response: HttpResponse<Option<web::Json<Result<B, Vec<MessageResource>>>>>,
24}
25impl<B: Serialize> TypedHttpResponse<B> {
26 pub fn return_standard_response(status_code: u16, body: B) -> TypedHttpResponse<B>{
34 TypedHttpResponse {
35 response: HttpResponse::with_body(StatusCode::from_u16(u16::from(status_code)).unwrap(), Some(web::Json(Ok(body))))
36 }
37 }
38 pub fn return_standard_error_list(status_code: u16, body: Vec<MessageResource>) -> TypedHttpResponse<B>{
40 TypedHttpResponse {
41 response: HttpResponse::with_body(StatusCode::from_u16(u16::from(status_code)).unwrap(), Some(web::Json(Err(body))))
42 }
43 }
44 pub fn return_standard_error(status_code: u16, body: MessageResource) -> TypedHttpResponse<B>{
46 TypedHttpResponse {
47 response: HttpResponse::with_body(StatusCode::from_u16(u16::from(status_code)).unwrap(), Some(web::Json(Err(vec![body]))))
48 }
49 }
50 pub fn return_empty_response(status_code: u16) -> TypedHttpResponse<B>{
54 TypedHttpResponse {
55 response: HttpResponse::with_body(StatusCode::from_u16(u16::from(status_code)).unwrap(), None)
56 }
57 }
58}
59
60impl<T: Serialize> Responder for TypedHttpResponse<T>
61{
62 type Body = BoxBody;
63 #[inline]
64 fn respond_to(self, _: &HttpRequest) -> HttpResponse<Self::Body> {
65 let mut builder = HttpResponseBuilder::new(self.response.status());
66 match self.response.body() {
67 Some(body) => {match body.0.as_ref() {
68 Ok(value) => builder.json(value),
69 Err(errors) => builder.json(errors),
70 }},
71 None => {builder.finish()}
72 }
73 }
74}
75