actix-web-error-derive

Crates.ioactix-web-error-derive
lib.rsactix-web-error-derive
version0.2.0
sourcesrc
created_at2022-08-15 19:03:16.958978
updated_at2023-05-05 16:50:42.141384
descriptionDerive macros for actix-web-error
homepage
repositoryhttps://github.com/Nerixyz/actix-web-error
max_upload_size
id646108
size32,959
nerix (Nerixyz)

documentation

README

actix-web-error

Error responses for actix-web made easy. This crate will make it easy implementing actix_web::ResponseError for errors by providing a thiserror-like API for specifying an HTTP status. It's best used in combination with thiserror.

Currently, only a JSON response is supported.

Thanks to the aforementioned thiserror project, I used the core structure and core utilities.

Error Responses

  • Json will respond with JSON in the form of { "error": <Display representation> } (application/json).
  • Text will respond with the Display representation of the error (text/plain).

Example

#[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;

This will roughly expand to:

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()
    }
}
Commit count: 22

cargo fmt