#error #locale #axum #yaml #messages #error-message #simplifies

standard-error

简化 axum 服务返回有意义的错误

2 个版本

新版本 0.1.1 2024 年 8 月 17 日
0.1.0 2024 年 8 月 17 日

64国际化 (i18n)

Download history 192/week @ 2024-08-12

每月 192 次下载

MIT 许可证

10KB
141

standard-error

standard-error 是一个 Rust 包,旨在简化为各种地区处理错误信息。它从 YAML 和其他来源读取错误信息,为您的应用程序提供一种结构化和高效的管理错误的方式。

功能

  • 特定地区的错误消息:自动获取指定地区的错误消息。
  • 灵活的数据源:从 YAML 文件和其他格式读取错误消息。
  • 易于集成:设计为与 Rust 网络框架(如 Axum)无缝工作。

用法

以下是在使用 standard-error 的 Web 应用程序中,使用 Axum 框架的示例

use axum::{
    extract::Query,
    Json,
    http::StatusCode,
};
use serde_json::{json, Value};
use std::collections::HashMap;
use standard_error::StandardError;

pub async fn my_handler(Query(params): Query<HashMap<String, String>>) -> Result<Json<Value>, StandardError> {
    let group = match params.get("name") {
        Some(g) => g,
        None => {
            return Err(StandardError::from("ER-0037", StatusCode::BAD_REQUEST));
        }
    };
    Ok(Json(json!({"message": "success"})))
}

说明

  • 错误处理:在示例中,StandardError 用于处理缺少必需查询参数的情况。如果未提供组参数,则函数返回带有适当错误代码和 HTTP 状态的 StandardError。
  • 错误代码:使用错误代码 "ER-0037" 根据地区查找相关错误消息。

安装

将 standard-error 添加到您的 Cargo.toml 中

[dependencies]
standard-error = "0.1"

或使用 cargo

cargo add standard-error

配置

要配置 standard-error,您可以提供包含不同地区错误消息的 YAML 文件。该包将自动根据您的应用程序中指定的地区加载正确消息。

示例 YAML 结构

errors:
  - code: ER-0001
    detail_en_US: "Missing required 'group' parameter."
    detail_hi_IN: "'group' पैरामीटर आवश्यक है।"
  - code: ER-0002
    detail_en_US: "Permission Denied"
    detail_hi_IN: "अनुमति अस्वीकृत"
  - code: ER-0003
    detail_en_US: "Not Found"
    detail_hi_IN: "नहीं मिला"

将此 YAML 文件(errors.yaml)放在目录根目录中,在 src 之外。或者您可以在任何您喜欢的地方保存它,并设置 ERROR_YAML_FILE_PATH 环境变量。

至于地区配置,默认情况下,该包从 DEFAULT_LOCALE 环境变量中获取默认值,默认设置为 en_US

  • 您可以更改此环境变量为任何您喜欢的值,只要您的错误 yaml 文件中存在相应的键。

如果您希望在任何给定点以编程方式动态更改地区,可以调用 standard_error::set_current_locale 函数,如下所示

use standard_error::set_current_locale;


fn my_business_logic(){
    //...
    set_current_locale("hi_IN");
    //...
}

这设置了一个线程局部refcell变量,它将在整个线程中持续存在。由于它是一个RefCell值,而不是像Arc这样的东西,所以你不必担心它泄漏到其他线程/请求中。

依赖项

~11MB
~209K SLoC