#error #axum #derive-error #macro-derive #enums #response #into-response

macro axum-derive-error

Proc macro to derive IntoResponse for errors for use with axum

1 unstable release

0.1.0 Aug 27, 2022

#31 in #derive-error

Download history 64/week @ 2024-07-20 97/week @ 2024-07-27 92/week @ 2024-08-03 73/week @ 2024-08-10 175/week @ 2024-08-17 122/week @ 2024-08-24 85/week @ 2024-08-31 22/week @ 2024-09-07 40/week @ 2024-09-14 174/week @ 2024-09-21 70/week @ 2024-09-28 29/week @ 2024-10-05 44/week @ 2024-10-12 68/week @ 2024-10-19 50/week @ 2024-10-26 30/week @ 2024-11-02

199 downloads per month

MIT/Apache

10KB
83 lines

axum-derive-error

Crates.io Crates.io

Proc macro to derive IntoResponse for error types for use with axum.

Your error type just needs to implement Error (Snafu or thiserror could be useful here), IntoResponse and Debug will be derived for you. By default errors will return a 500 response, but this can be specified with the #[status = ...] attribute.

Example:

use std::{error::Error, fmt::Display};
use axum_derive_error::ErrorResponse;
use axum::http::StatusCode;

#[derive(ErrorResponse)]
pub enum CreateUserError {
    /// No status provided, so this will return a 500 error.
    /// All 5xx errors will not display their message to the user, but will produce a tracing::error log
    InsertUserToDb(sqlx::Error),

    /// 422 returned as the response, the display implementation will be used as a message for the user
    #[status(StatusCode::UNPROCESSABLE_ENTITY)]
    InvalidBody(String),
}

impl Error for CreateUserError {
    fn source(&self) -> Option<&(dyn Error + 'static)> {
        match self {
            Self::InsertUserToDb(source) => Some(source),
            Self::InvalidBody(_) => None,
        }
    }
}

impl Display for CreateUserError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            Self::InsertUserToDb(source) => write!(f, "failed to insert user into the database"),
            Self::InvalidBody(message) => write!(f, "body is invalid: {message}"),
        }
    }
}

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~1.5MB
~37K SLoC