#error-derive #error #actix-web #derive #http

actix-web-error-derive

为actix-web-error提供派生宏

2个不稳定版本

0.2.0 2023年5月5日
0.1.0 2022年8月15日

#15 in #error-derive

41 每月下载量
用于 actix-web-error

MIT/Apache

21KB
489

actix-web-error

actix-web提供简单易用的错误响应。这个crate通过提供一个类似于thiserror的API来指定HTTP状态,简化了实现actix_web::ResponseError的过程。最佳与thiserror结合使用。

目前仅支持JSON响应。

感谢thiserror项目,我使用了其核心结构和核心工具。

错误响应

  • Json将以JSON格式响应,形式为{ "error": <Display representation> } (application/json)。
  • Text将以错误的Display表示形式响应(text/plain)。

示例

#[derive(Debug, thiserror::Error, actix_web_error::Json)]
#[status(BAD_REQUEST)] // default status for all variants
enum MyError {
    #[error("Missing: {0}")]
    MissingField(&'static str),
    #[error("Malformed Date")]
    MalformedDate,
    #[error("Internal Server Error")]
    #[status(500)] // specific override
    Internal,
}

#[derive(Debug, thiserror::Error, actix_web_error::Text)]
#[error("Item not found")]
#[status(404)]
struct MyOtherError;

这大致可以展开为

use actix_web::{ResponseError, HttpResponse, HttpResponseBuilder, http::StatusCode};

#[derive(Debug, thiserror::Error)]
enum MyError {
    #[error("Missing: {0}")]
    MissingField(&'static str),
    #[error("Malformed Date")]
    MalformedDate,
    #[error("Internal Server Error")]
    Internal,
}

#[derive(Debug, thiserror::Error)]
#[error("Item not found")]
struct MyOtherError;

impl ResponseError for MyError {
    fn status_code(&self) -> StatusCode {
        match self {
            Self::Internal => StatusCode::from_u16(500).unwrap(),
            _ => StatusCode::BAD_REQUEST,
        }
    }

    fn error_response(&self) -> HttpResponse {
        HttpResponseBuilder::new(self.status_code())
            .json(serde_json::json!({ "error": self.to_string() }))
    }
}

impl ResponseError for MyOtherError {
    fn status_code(&self) -> StatusCode {
        // With at least opt-level=1, this unwrap will be removed,
        // so this function will essentially return a constant.
        StatusCode::from_u16(404).unwrap()
    }
}

依赖项

~0.8–1.3MB
~27K SLoC