From 0f8bc8de13cf07cdabcc79190e0f16c81e93643d Mon Sep 17 00:00:00 2001 From: RA <70325462+RAprogramm@users.noreply.github.com> Date: Thu, 11 Sep 2025 13:33:46 +0700 Subject: [PATCH] Fix status code conversions for web adapters --- src/response.rs | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/src/response.rs b/src/response.rs index 806aafb..c627e19 100644 --- a/src/response.rs +++ b/src/response.rs @@ -180,17 +180,17 @@ impl ErrorResponse { /// /// # Examples /// - /// ``` - /// use http::StatusCode; - /// use masterror::{AppCode, ErrorResponse}; - /// - /// let resp = ErrorResponse::new(404, AppCode::NotFound, "missing"); - /// assert_eq!(resp.status_code(), StatusCode::NOT_FOUND); - /// ``` - #[must_use] - pub fn status_code(&self) -> StatusCode { - StatusCode::from_u16(self.status).unwrap_or(StatusCode::INTERNAL_SERVER_ERROR) - } +/// ``` +/// use http::StatusCode; +/// use masterror::{AppCode, ErrorResponse}; +/// +/// let resp = ErrorResponse::new(404, AppCode::NotFound, "missing").expect("status"); +/// assert_eq!(resp.status_code(), StatusCode::NOT_FOUND); +/// ``` +#[must_use] +pub fn status_code(&self) -> StatusCode { + StatusCode::from_u16(self.status).unwrap_or(StatusCode::INTERNAL_SERVER_ERROR) +} } /// Legacy constructor retained for migration purposes. @@ -258,7 +258,7 @@ mod axum_impl { use axum::{ Json, http::{ - HeaderValue, + HeaderValue, StatusCode as AxumStatus, header::{RETRY_AFTER, WWW_AUTHENTICATE} }, response::{IntoResponse, Response} @@ -269,7 +269,8 @@ mod axum_impl { impl IntoResponse for ErrorResponse { fn into_response(self) -> Response { - let status = self.status_code(); + let status = + AxumStatus::from_u16(self.status).unwrap_or(AxumStatus::INTERNAL_SERVER_ERROR); // Serialize JSON body first (borrow self for payload). let mut response = (status, Json(&self)).into_response(); @@ -315,7 +316,10 @@ mod actix_impl { use actix_web::{ HttpRequest, HttpResponse, Responder, body::BoxBody, - http::header::{RETRY_AFTER, WWW_AUTHENTICATE} + http::{ + StatusCode as ActixStatus, + header::{RETRY_AFTER, WWW_AUTHENTICATE} + } }; use super::ErrorResponse; @@ -324,7 +328,8 @@ mod actix_impl { type Body = BoxBody; fn respond_to(self, _req: &HttpRequest) -> HttpResponse { - let status = self.status_code(); + let status = + ActixStatus::from_u16(self.status).unwrap_or(ActixStatus::INTERNAL_SERVER_ERROR); let mut builder = HttpResponse::build(status); if let Some(retry) = self.retry { @@ -376,11 +381,11 @@ mod tests { #[test] fn status_code_maps_invalid_to_internal_server_error() { use http::StatusCode; - - let valid = ErrorResponse::new(404, AppCode::NotFound, "missing"); + let valid = ErrorResponse::new(404, AppCode::NotFound, "missing").expect("status"); assert_eq!(valid.status_code(), StatusCode::NOT_FOUND); - let invalid = ErrorResponse::new(1000, AppCode::Internal, "oops"); + let mut invalid = valid.clone(); + invalid.status = 1000; assert_eq!(invalid.status_code(), StatusCode::INTERNAL_SERVER_ERROR); }