deserr 0.6.4

Deserialization library with focus on error handling
Documentation
# Already available error type

Deserr comes with two predefined error type for json and query parameters.

### Json

Json support is made through the [`JsonError`](https://docs.rs/deserr/latest/deserr/errors/json/struct.JsonError.html) type.

#### Changes to the error messages 

Here's a non-exhaustive list of some of the changes that are made to the error message compared to `serde_json`:
- Instead of providing the bytes indice of the error it provides the path of the error using dot: `error.on.field[3]`.
- Use the word `array` instead of `Sequence`
- Use the word `object` instead of `Map`
- Never talk about rust type like `u8` and instead use words like number/integer or the bounds of the number directly.
- When using the `deny_unknown_parameter` container attribute deserr will:
  - List all the available fields of the object.
  - Find and propose the field with the closest name of what was typed with a "did you mean" message.

#### Examples

```rust
use deserr::{Deserr, errors::JsonError};
use serde_json::json;
#[derive(Deserr, Debug)]
#[deserr(deny_unknown_fields, rename_all = camelCase)]
struct Search {
    q: Values,
    filter: u8,
}
#[derive(Deserr, Debug)]
#[deserr(rename_all = camelCase)]
enum Values {
    Q,
    Filter,
}

// The field name is wrong but is close enough of `filter`
let value = json!({ "filler": "doggo" });
let err = deserr::deserialize::<Search, _, JsonError>(value).unwrap_err();
assert_eq!(err.to_string(), "Unknown field `filler`: did you mean `filter`? expected one of `q`, `filter`");

// The field name isn't close to anything
let value = json!({ "a": "doggo" });
let err = deserr::deserialize::<Search, _, JsonError>(value).unwrap_err();
assert_eq!(err.to_string(), "Unknown field `a`: expected one of `q`, `filter`");

// Did you mean also works with enum value
let value = json!({ "q": "filler" });
let err = deserr::deserialize::<Search, _, JsonError>(value).unwrap_err();
assert_eq!(err.to_string(), "Unknown value `filler` at `.q`: did you mean `filter`? expected one of `q`, `filter`");

let value = json!({ "filter": [2] });
let err = deserr::deserialize::<Search, _, JsonError>(value).unwrap_err();
assert_eq!(err.to_string(), "Invalid value type at `.filter`: expected a positive integer, but found an array: `[2]`");
```

### Query Parameter

Query parameter support is made through the [`QueryParamError`](https://docs.rs/deserr/latest/deserr/errors/query_params/struct.QueryParamError.html) type.

#### Changes to the error messages 

Here's a non-exhaustive list of some of the changes that are made to the error message compared to `serde_qs`:
- Instead of providing the bytes indice of the error it provides the path of the error using dot: `error.on.parameter[3]`.
- Use the word `multiple values` instead of `Sequence`
- Use the word `multiple parameters` instead of `Map`
- Never talk about rust type like `u8` and instead use words like number/integer or the bounds of the number directly.
- When using the `deny_unknown_parameter` container attribute deserr will:
  - List all the available parameters of the object.
  - Find and propose the parameter with the closest name of what was typed with a "did you mean" message.

#### Examples


```rust
use deserr::{Deserr, errors::QueryParamError};
use serde_json::json;
#[derive(Deserr, Debug)]
#[deserr(deny_unknown_fields, rename_all = camelCase)]
struct Search {
    q: Values,
    filter: u8,
}
#[derive(Deserr, Debug)]
#[deserr(rename_all = camelCase)]
enum Values {
    Q,
    Filter,
}

// The field name is wrong but is close enough of `filter`
let value = json!({ "filler": "doggo" });
let err = deserr::deserialize::<Search, _, QueryParamError>(value).unwrap_err();
assert_eq!(err.to_string(), "Unknown parameter `filler`: did you mean `filter`? expected one of `q`, `filter`");

// The parameter name isn't close to anything
let value = json!({ "a": "doggo" });
let err = deserr::deserialize::<Search, _, QueryParamError>(value).unwrap_err();
assert_eq!(err.to_string(), "Unknown parameter `a`: expected one of `q`, `filter`");

// Did you mean also works with enum value
let value = json!({ "q": "filler" });
let err = deserr::deserialize::<Search, _, QueryParamError>(value).unwrap_err();
assert_eq!(err.to_string(), "Unknown value `filler` for parameter `q`: did you mean `filter`? expected one of `q`, `filter`");

let value = json!({ "filter": [2] });
let err = deserr::deserialize::<Search, _, QueryParamError>(value).unwrap_err();
// The query parameters are always expecting string in the values
assert_eq!(err.to_string(), "Invalid value type for parameter `filter`: expected a string, but found multiple values");
```

### Want another format

Feel free to open an issue or a PR