6 个版本
0.0.6 | 2023 年 6 月 4 日 |
---|---|
0.0.5 | 2023 年 6 月 4 日 |
0.0.4 | 2023 年 5 月 28 日 |
#596 在 开发工具
25KB
256 行
README
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