Skip to main content

statespace_server/
error.rs

1//! Error types with HTTP status code mapping.
2
3use axum::Json;
4use axum::http::StatusCode;
5use axum::response::{IntoResponse, Response};
6use statespace_tool_runtime::ErrorResponse;
7
8pub use statespace_tool_runtime::Error;
9pub type Result<T> = std::result::Result<T, Error>;
10
11pub trait ErrorExt {
12    fn status_code(&self) -> StatusCode;
13}
14
15impl ErrorExt for Error {
16    fn status_code(&self) -> StatusCode {
17        StatusCode::from_u16(self.http_status_code()).unwrap_or(StatusCode::INTERNAL_SERVER_ERROR)
18    }
19}
20
21#[derive(Debug)]
22pub struct ServerError(pub Error);
23
24impl From<Error> for ServerError {
25    fn from(e: Error) -> Self {
26        Self(e)
27    }
28}
29
30impl IntoResponse for ServerError {
31    fn into_response(self) -> Response {
32        let status = self.0.status_code();
33        let response = ErrorResponse::new(self.0.user_message());
34        (status, Json(response)).into_response()
35    }
36}