Skip to content
/ baxe Public

A library that simplifies error handling in Axum

License

Notifications You must be signed in to change notification settings

zyphelabs/baxe

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Better Axum Errors

License Crates.io Version

Description

Better Axum Error (aka. baxe) is a utility that streamlines error handling in backend services built with Axum. With a simple and readable macro, you can define your backend errors once and automatically generate standardized JSON error responses, saving time and reducing complexity.

Table of Contents

Installation

cargo add baxe

Usage

Attributes

  • logMessageWith: allows to use a logger to log the error message before sending the response
  • hideMessage: allows to exclude the message from the body of the response

Example

use baxe::{baxe_error, BackendError}; 

baxe_error!(String, serde(rename_all = "camelCase"), derive(Clone));

// Optional: thiserror definitions work with baxe too 
#[derive(Debug, thiserror::Error)]
pub enum EmailValidationError {
    #[error("Email address syntax is invalid: received '{0}', expected value matching '{1}'")]
    InvalidSyntax(String, String),
    #[error("Email domain is unknown")]
    UnknownDomain
}


#[baxe::error(logMessageWith=tracing::error, hideMessage)] // Use the macro to define your errors
pub enum BackendErrors {
    #[baxe(status = StatusCode::BAD_REQUEST, tag = "bad_request", code = 400, message = "Bad request: {0}")]
    BadRequest(String),
    #[baxe(status = StatusCode::UNAUTHORIZED, tag = "auth/invalid_email_or_password", code = 10_000, message = "Invalid email or password")]
    InvalidEmailOrPassword,
    #[baxe(status = StatusCode::BAD_REQUEST, tag = "auth/invalid_email_format", code = 10_001, message = "Invalid email format: {0}")]
    InvalidEmailFormat(EmailValidationError),
}

Example axum handler:

pub async fn handler() -> Result<Json<String>, BaxeError> {
    if let Err(e) = validate_email(email) {
        return Err(BackendErrors::InvalidEmailFormat(e).into());
    }

    Ok(Json("Hello, world!".to_string()))
}

The above code allows to log a descriptive error:

2025-01-10T09:58:56.677274Z  ERROR my_app:handlers: Invalid email format: Email address syntax is invalid: received 'example.com', expected value matching '^[^@]+@[^@]+\.[^@]+$'"

and automatically generates the following error response type:

#[derive(std::fmt::Debug, serde::Serialize)]
#[serde(rename_all = "camelCase")]
#[derive(Clone)]
pub struct BaxeError {
    #[serde(skip)]
    pub status_code: axum::http::StatusCode,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub message: Option<String>,
    pub code: u16,
    pub error_tag: String,
}

that is serialized to the following json response:

{
  "code": 10001,
  "errorTag": "auth/invalid_email_format"
}

Contributing

Feel free to open issues and send PRs. We will evaluate them together in the comment section.

License

This project is licensed under the MIT License.

About

A library that simplifies error handling in Axum

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages