# README [crates.io](https://crates.io/crates/errjson) [docs.rs](https://docs.rs/errjson) [github](https://codeberg.org/AlbanMinassian/errorjson) [ErrJson](https://crates.io/crates/errjson): easy complex and intuitive Rust [Error](https://doc.rust-lang.org/std/error/trait.Error.html) json ## Usage ```rust use errjson::ErrJson; fn myfnc() -> Result> { ErrJson!(code = "ERR001", message = "An error message") } ``` return a valid Rust [Error](https://doc.rust-lang.org/std/error/trait.Error.html) with a json stringify ```json { "iserr":true, "err":{ "code":"ERR001", "message":"An error message" } } ``` ## Embed caused error ```rust use errjson::ErrJson; fn myfnc() -> Result> { let error = "NaN".parse::().unwrap_err(); ErrJson!( code = "ERR002", message = "An error message", origin = error // <-- 'std::error::Error' only ) } ``` return ```json { "iserr":true, "err":{ "code":"ERR002", "message":"An error message", "origin": "invalid digit found in string" } } ``` Deep error allowed (see example [full example code](./examples/full.rs)) ```json { "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 }, } }, } }, } ``` ## Embed payload ```rust use errjson::ErrJson; fn myfnc() -> Result> { ErrJson!( code = "ERR003", message = "An error message", payload = serde_json::json!({ "more": "data" }) // <-- 'serde_json::Value' only ) } ``` return ```json { "iserr":true, "err":{ "code":"ERR003", "message":"An error message", "payload": { "more": "data" } } } ``` ## Examples - `cargo run --example full` - `cargo run --example minimal` ##  Why ErrJson ? Without [ErrJson](https://crates.io/crates/errjson), you can can write basic `Err` like this, but hard with a complex json, not normalize and difficult to embed 'caused' error. - `Err(r#"{"error":"json", ...}"#);` - `Err(serde_json::to_string(serde_json::json!({"error": "json", ...})));`