torrust_index_backend/web/api/v1/
responses.rs
1use axum::response::{IntoResponse, Response};
3use hyper::{header, StatusCode};
4use serde::{Deserialize, Serialize};
5use serde_json::json;
6
7use crate::databases::database;
8use crate::errors::{http_status_code_for_service_error, map_database_error_to_service_error, ServiceError};
9
10#[derive(Serialize, Deserialize, Debug)]
11pub struct OkResponseData<T> {
12 pub data: T,
13}
14
15#[derive(Serialize, Deserialize, Debug)]
16pub struct ErrorResponseData {
17 pub error: String,
18}
19
20impl IntoResponse for ServiceError {
21 fn into_response(self) -> Response {
22 json_error_response(
23 http_status_code_for_service_error(&self),
24 &ErrorResponseData { error: self.to_string() },
25 )
26 }
27}
28
29impl IntoResponse for database::Error {
30 fn into_response(self) -> Response {
31 let service_error = map_database_error_to_service_error(&self);
32
33 json_error_response(
34 http_status_code_for_service_error(&service_error),
35 &ErrorResponseData {
36 error: service_error.to_string(),
37 },
38 )
39 }
40}
41
42fn json_error_response(status_code: StatusCode, error_response_data: &ErrorResponseData) -> Response {
43 (
44 status_code,
45 [(header::CONTENT_TYPE, "application/json")],
46 json!(error_response_data).to_string(),
47 )
48 .into_response()
49}