torrust_index_backend/web/api/v1/
responses.rs

1//! Generic responses for the API.
2use 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}