# README
[](https://crates.io/crates/errjson)
[](https://docs.rs/errjson)
[](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", ...})));`