#error-derive #error #error-response #macro-derive #api-error #http-response #rest

macro actix-error-derive

A simple library to handle REST errors, with a derive macro to generate the error type. It also provides a compatibility layer with actix-web.

9 releases

0.2.6 Feb 23, 2024
0.2.5 Feb 23, 2024
0.1.4 Feb 18, 2024

#14 in #error-derive

Used in actix-error

MIT license

160 lines



The derive(AsApiError) library provides a powerful, derive macro for Rust developers working with Actix-Web to easily convert enum variants into structured API errors. This library simplifies error handling in web applications by enabling automatic mapping of custom error types to HTTP response errors.


  • Automatic Conversion: Automatically convert enum variants to ApiError instances, including status codes, error kinds, and messages.
  • Customizable Error Responses: Customize error messages and HTTP status codes directly in enum definitions.
  • Support for Structured Errors: Handle errors with additional context, supporting both unnamed and named fields in enum variants.
  • Group Error Handling: Aggregate related errors into groups for streamlined error management.
  • Integration with Actix-Web: Seamlessly integrates with Actix-Web's error handling mechanisms.


actix_error = "0.2.5"


Defining Errors

Use the #[derive(AsApiError)] macro on enums to define your error types. Customize each variant with #[error] attributes to specify HTTP status codes, error messages, and more.

Handling Errors in Actix-Web

Implement your Actix-Web handlers to return your custom errors. The AsApiErrorTrait ensures they are automatically converted into appropriate HTTP responses.

async fn my_handler() -> Result<HttpResponse, MyError> {
    // Your handler logic here...

Advanced Error Handling

For errors requiring additional context, use named or unnamed fields directly in your enum variants.

pub enum DetailedError {
    #[error(code = 500, msg = "Unexpected error occurred: {0}")]
    #[error(status = "BadRequest", msg = "Invalid input: {field}")]
    ValidationError { field: DataField },

pub enum Error {
    Detailed(DetailedError), // Group errors together
    #[error(code = 500, msg = "Database error occurred", ignore)]
    DatabaseError(PostgresError), // Ignore the unnamed field

Response format

    "kind": "system_error",
    "message": "Unexpected error occurred: Internal Server Error"


~478K SLoC