#json-error #error #error-handling

errjson

简单、复杂且直观的 Rust Error json

6 个版本

0.0.6 2023 年 6 月 4 日
0.0.5 2023 年 6 月 4 日
0.0.4 2023 年 5 月 28 日

#596开发工具

MIT/Apache

25KB
256

README

crates.io docs.rs github

ErrJson: 简单、复杂且直观的 Rust Error json

使用方法

use errjson::ErrJson;
fn myfnc() -> Result<i32, Box<dyn std::error::Error>> {
    ErrJson!(code = "ERR001", message = "An error message")
}

返回一个带有 json 字符串化的有效 Rust Error

{
    "iserr":true,
    "err":{
        "code":"ERR001",
        "message":"An error message"
    }
}

嵌入错误原因

use errjson::ErrJson;
fn myfnc() -> Result<i32, Box<dyn std::error::Error>> {
    let error = "NaN".parse::<u32>().unwrap_err();
    ErrJson!(
        code = "ERR002",
        message = "An error message",
        origin = error // <-- 'std::error::Error' only
    )
}

返回

{
    "iserr":true,
    "err":{
        "code":"ERR002",
        "message":"An error message",
        "origin": "invalid digit found in string"
    }
}

深度错误允许(见示例 完整示例代码

{
    "meta": { "whoami": { "filename": "errjson/examples/full.rs", "function": "main", "line": 42 } },
    "iserr": true,
    "err": {
        "code": "ERR0001",
        "message": "Error when main() call myfnc()",
        "origin": { // rust 'caused' error 
            "meta": { "whoami": { "filename": "errjson/examples/full.rs", "function": "myfnc", "line": 26 } },
            "iserr": true,
            "err": {
                "code": "ERR0002",
                "message": "Error when myfnc() call mysubfnc()",
                "origin": { // rust 'caused' error 
                    "meta": { "whoami": { "filename": "errjson/examples/full.rs", "function": "mysubfnc", "line": 11 } },
                    "iserr": true,
                    "err": {
                        "code": "ERR003",
                        "message": "Error when mysubfnc() call mysubsubfnc()",
                        "origin": "No such file or directory (os error 2)", // native rust 'caused' error
                        "payload": { "more": { "complex": "data" } } // <-- add another data if you want

                    },
                }
            },
        }
    },
}

嵌入有效负载

use errjson::ErrJson;
fn myfnc() -> Result<i32, Box<dyn std::error::Error>> {
    ErrJson!(
        code = "ERR003",
        message = "An error message",
        payload = serde_json::json!({ "more": "data" }) // <-- 'serde_json::Value' only
    )
}

返回

{
    "iserr":true,
    "err":{
        "code":"ERR003",
        "message":"An error message",
        "payload": { "more": "data" }
    }
}

示例

  • cargo运行 --示例完整
  • cargo运行 --示例最小

 为什么选择 ErrJson ?

没有 ErrJson,您可以编写基本的 Err,但处理复杂的 json 非常困难,无法规范化且难以嵌入 'caused' 错误。

  • Err(r#"{"error":"json", ...}"#);
  • Err(serde_json::to_string(serde_json::json!({"error": "json", ...})));

依赖项

~0.7–1.6MB
~34K SLoC