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

axum-derive-error

用于 axum 的错误类型派生 IntoResponse 的进程宏

1 个不稳定版本

0.1.0 2022 年 8 月 27 日

18#derive-error

Download history 64/week @ 2024-03-13 44/week @ 2024-03-20 65/week @ 2024-03-27 52/week @ 2024-04-03 27/week @ 2024-04-10 33/week @ 2024-04-17 79/week @ 2024-04-24 71/week @ 2024-05-01 54/week @ 2024-05-08 35/week @ 2024-05-15 40/week @ 2024-05-22 68/week @ 2024-05-29 126/week @ 2024-06-05 70/week @ 2024-06-12 86/week @ 2024-06-19 142/week @ 2024-06-26

444 每月下载量

MIT/Apache

10KB
83

axum-derive-error

Crates.io Crates.io

用于 axum 的错误类型派生 IntoResponse 的进程宏。

您的错误类型只需要实现 Error (Snafu 或 thiserror 可能在这里很有用),IntoResponse 和 Debug 将为您派生。默认情况下,错误将返回 500 响应,但可以使用 #[status = ...] 属性指定。

示例

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}"),
        }
    }
}

许可

根据您的选择,受以下任一项许可协议保护:

贡献

除非您明确声明,否则您提交给工作的任何有意贡献,根据 Apache-2.0 许可协议定义,将按上述方式双重许可,不附加任何其他条款或条件。

依赖项

~1.5MB
~35K SLoC