Crates.io | actix-web-error-derive |
lib.rs | actix-web-error-derive |
version | 0.2.0 |
source | src |
created_at | 2022-08-15 19:03:16.958978 |
updated_at | 2023-05-05 16:50:42.141384 |
description | Derive macros for actix-web-error |
homepage | |
repository | https://github.com/Nerixyz/actix-web-error |
max_upload_size | |
id | 646108 |
size | 32,959 |
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.
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
).#[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()
}
}